我试图将一个非托管的C++ Dll从一个嵌入式设备移植到另一个嵌入式设备,并面临一些奇怪的问题,我认为这些问题肯定与内存管理和/或编译器有关。我并没有发布太多的代码,而是描述我尝试过的内容,因为我尝试了太多不同的东西来发布所有的代码,我认为问题肯定在更深的地方。
第一个设备运行WinCE 5.0,并使用嵌入式VisualVISUAL4.0编译。第二个设备是运行WindowsEmbeddedCompact7(为了简单起见,我将称之为WinCE 7),并使用VS2008进行编译。这两种设备都有自己为板设计的SDK。
在第一个设备上,Dll运行时没有出现任何问题,但在第二个设备上,使用new编译的Dll无法工作。在第二个设备上有一个C#应用程序,我试着用PInvoke来访问dll,但是在调试模式中的PInvoke行上得到了错误消息:
找不到PInvoke DLL NAME.dll
After some research I学习了这个错误可能有不同的原因:
我用peinfo来检查dll。所有依赖项都在设备上找到,它是为WinCE 7编译的,处理器类型是正确的。(如果不使用正确的SDK,我会感到惊讶)所以仍然有第4条:没有足够的虚拟内存。但是WinCE5仅限于32 up的虚拟内存并在运行,而WinCE7可以有最多2GB的内存吗?所以我开始尝试一些东西来缩小错误,然后告诉你我的结果。
首先,我使用为第一个设备编译的dll,并尝试在第二个设备上使用它。令人惊讶的是,.net应用程序能够找到并PInvoke这个应用程序。但是Dll中的一些函数似乎没有正确运行,所以我想我必须使用正确的SDK。但是,对于两个dll都有正确的代码,我知道导出必须是正确的。我知道这两个编译器使用不同的c++名称破坏样式,所以这也不是问题。
接下来,我在c++上编写了一个简单的VS2008应用程序,使用新的SDK从那里加载Dll。在第一个设备上,应用程序以这种方式运行,但现在,在运行在第二个设备上的远程显示中,我得到了错误消息:
无法导入库NAME.dll!程序将退出。
至少现在我知道这与.net和PInvoke无关。但是更进一步,我使用VS2008创建了一个简单的新dll,新的SDK和ne应用程序可以将其用于.net。所以代码中一定有不喜欢加载的东西。*-/
经过几个小时的代码搜索,我意识到系统不喜欢一些全局变量。我知道全局变量是坏的,如果它们不在的话,我会很高兴,但是我还没有开始编写代码,这些年来,在我处理它之前,它们越来越多,所以它们现在很难删除。
这些全局值是类的实例。他们中的一些人似乎很坏,有些人似乎还好。令人困惑的是,它们都是类的实例,我不知道为什么会有好的和坏的。当我注释掉坏的全局时,应用程序可以PInvoke这个Dll。一个坏的全局就足以使应用程序找不到Dll。
为什么在VS2008 7中使用WinCE,而对WinCE 5不使用eVC4.0呢?全球的问题是什么?我该如何解决这个问题?充其量,相同的代码应该适用于两个编译器,但首先我需要一些想法,第二个编译器有什么问题。
发布于 2014-08-04 13:40:37
我已经找到了Dll加载问题的解决方案。这两种系统在#语用包上有着不同的行为。因此,在加载dll时,最终出现了对齐错误,导致dll崩溃。由于它是在动态链接库的加载过程中出现的,所以错误消息并没有说错对齐,但是标准“找不到PInvoke DLL”。
https://stackoverflow.com/questions/24958463
复制相似问题