为什么从.net调用的原生代码与从原生程序调用时产生不同的结果?我们有一个本地库,用于为我们执行与安全相关的任务。我们编写了一个互操作库,以便我们可以在.NET中使用它。我们有两个测试应用程序,第一个应用程序是用C++(非托管)编写的,第二个是用C#编写的。它们生成与本机库完全相同的调用序列,但结果不同。我迷路了,找不到任何明显的.NET导入定义错误。我把它搞砸了,所以我只使用了一个非常简单的界面。我正在寻找为什么从.NET环境调用本机库可能会影响结果的想法。编辑:我对图书馆没有很深的了解,所以我不能提供太多关于本机代码的功能。我知道它确实维护(繁荣)线程。库的另一部分(标识应用程序是否在VM上运行)表现出相同的行为。它不一定相关。我用C++/CLI编写了另一个测试应用程序,因为使用本机库比使用C#更容易,而且它给出的结果也与C#相同。疯狂猜测:您将一个接受布尔值的函数编组为一个接受布尔值的函数。当从本机代码和托管代码调用时,这会产生不同的结果,因为bool不能编组为bool一种可能性是本机库使用本机线程本地存储。托管线程和本机线程之间没有(必然)一对一的映射。为了消除这种可能性,您可以尝试将整个调用序列(即对库的所有调用的一对调用,而不是对库的每个调用)包装在对BeginThreadAffinity/EndThreadAffinity关键字的调用中:我们写了一个互操作库,以便我们可以在.NET(本机库)中使用它。这是错误的来源,而不是本机库。一个特定的本机调用(一个带有特定参数的特定函数调用)无论如何调用都会返回相同的结果。问题是您的包装器可能会引入细微的错误,您“认为”您正在进行相同的调用,但互操作版本的调用略有不同(因此结果不同)。我将从最低级别互操作库的一些非常好的单元测试开始。本机函数foo(intx,inty)。本机调用它,通过库调用它。结果应该是一样的。继续,直到找到不存在的函数调用。如果存在差异,那么问题不在于您的编组和互操作本机库。如果您发现单个调用返回不同的结果并且您无法在互操作中找到错误的来源,请将单个调用作为问题发布到SO上。正如其他人所建议的那样,这可能是编组/互操作问题。但也可能是本机库正在对其环境做出不只是在调用签名中表达的假设。有很多方法可以做出这样的假设。作为一个随机示例,MFC库中不调用AFX_MANAGE_STATE宏的方法在从.NET代码调用时可能会做出无效假设。以上是C#学习教程:为什么.net调用的nativecode和nativeprogram调用的结果不一样?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
