2010-11-29 43 views
0

我们有一个本地库,我们用它来为我们执行安全相关的任务。我们编写了一个互操作库,以便我们可以从.NET使用它。为什么从.net调用的本地代码从本地程序调用它会给出不同的结果?

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

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

编辑: 我没有深入的图书馆知识,所以我不能提供很多有关在本地代码中完成的工作。我知道它确实保持了(热感)线程。用于识别应用程序是否在虚拟机上运行的库的另一部分也具有相同的行为。这不一定相关。

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

+5

我认为这里需要更多infomartion。你做什么,你怎么做? =) – Jens 2010-11-29 13:45:22

+0

原生库不太可能是不同结果的来源。机会是,差异在于测试应用程序。 – 2010-11-29 13:47:22

+0

这可能有许多不同的原因。你能提供更多细节吗? – 2010-11-29 13:47:31

回答

2

疯狂的猜测:你将函数编号为bool的函数编号为bool。由于bool不能编组到bool

1

当从本地代码和托管代码调用时,会给出不同的结果,如果本机库使用本地线程本地存储,则可能会出现这种情况。托管线程和本地线程之间没有(必然)一对一映射。

为了消除这种可能性,您可以尝试在调用BeginThreadAffinity/EndThreadAffinity的过程中打包整个调用序列(也就是说,跨所有调用进入库中的一对调用,而不是每个调用周围的一对调用进库)

0

关键词:

我们写了一个互操作库,这样我们可以从.NET中使用它(本地库)。

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

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

0

这可能是一个编组/ interop问题,正如其他人所建议的。

但也可能是本地库正在对其环境进行假设,而这些假设并不仅仅表示在呼叫签名中。

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

相关问题