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

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

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

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

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

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

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

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

为了消除这种可能性,你可以尝试在对BeginThreadAffinity / EndThreadAffinity的调用中包装整个调用序列(也就是说,对所有调用库的调用中的一对调用,而不是围绕每个调用库的调用)

关键词:

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

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

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

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

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

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