为什么从.net调用的本机代码会从本机程序中调用它而产生不同的结果?

时间:2010-11-29 13:43:19

标签: c# .net interop native

我们有一个本地库,我们用它来为我们执行安全相关的任务。我们编写了一个互操作库,以便我们可以在.NET中使用它。

我们有两个测试应用程序,第一个应用程序是用C ++编写的(非托管),第二个是用C#编写的。它们生成与本机库完全相同的调用序列,但会产生不同的结果。

我迷路了,在.NET导入定义中找不到任何明显的错误。我已经把它搞砸了,所以我只使用一个非常简单的界面。我正在寻找为什么从.NET环境调用本机库可能会影响结果的想法。

编辑: 我对图书馆没有深入的了解,所以我无法提供很多关于本机代码的内容。我知道它确实维持(热潮)线程。该库的另一部分用于识别应用程序是否在VM上运行,也表现出相同的行为。这不一定是相关的。

我在C ++ / CLI中编写了另一个测试应用程序,因为它比使用C#更容易使用本机库,并且它也提供与C#相同的结果。

4 个答案:

答案 0 :(得分:2)

狂野猜测:你将bool的函数编组到一个函数bool。从原生代码和托管代码调用时,这会产生不同的结果,因为bool不能编组到bool

答案 1 :(得分:1)

一种可能性是本机库使用本机线程本地存储。托管线程和本机线程之间没有(必然)一对一的映射。

为了消除这种可能性,您可以尝试在调用BeginThreadAffinity / EndThreadAffinity内调整整个调用序列(也就是说,对所有调用库中的调用中的一对调用,而不是一对调用每个人都打电话进入图书馆)

答案 2 :(得分:0)

关键词:

我们编写了一个互操作库,以便我们可以在.NET中使用它(本机库)。

这是您的错误的来源,而不是本机库。无论如何调用,特定的本机调用(特定函数调用w /特定参数)都将返回相同的结果。问题在于你的包装器可以引入微妙的错误,你“认为”你正在进行相同的调用但是互操作版本的调用稍有不同(因此结果不同)。

我会从最低级别的互操作库的一些非常精细的单元测试开始。本机函数foo(int x,int y)。本地调用它,通过库调用它。结果应该是一样的。继续,直到找到函数调用,而不是。 如果存在差异,则问题与您的编组和问题有关。互操作不是本地库。如果您发现单个调用返回差异结果而您无法在互操作中找到错误的来源,则将单个调用作为问题发布在SO上。

答案 3 :(得分:0)

正如其他人所建议的那样,它可能是编组/互操作的问题。

但也可能是本机库正在对其环境做出假设,而这些假设并不仅仅在呼叫签名中表达。

有很多方法可以做出这样的假设。作为一个随机示例,MFC库中不调用AFX_MANAGE_STATE宏的方法可能会在从.NET代码调用时进行无效的假设。