首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将嵌入式Dll从eVC移植到VS2008会导致找不到dll

将嵌入式Dll从eVC移植到VS2008会导致找不到dll
EN

Stack Overflow用户
提问于 2014-07-25 14:48:46
回答 1查看 223关注 0票数 0

我试图将一个非托管的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学习了这个错误可能有不同的原因:

  1. 缺少要调用的本机库的依赖项。
  2. 本机是为错误的子系统(即桌面,而不是CE)编译的。
  3. 本机程序集是为错误的处理器(即x86而不是ARM)编译的。
  4. 没有足够的虚拟内存来加载DLL。

我用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呢?全球的问题是什么?我该如何解决这个问题?充其量,相同的代码应该适用于两个编译器,但首先我需要一些想法,第二个编译器有什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-04 13:40:37

我已经找到了Dll加载问题的解决方案。这两种系统在#语用包上有着不同的行为。因此,在加载dll时,最终出现了对齐错误,导致dll崩溃。由于它是在动态链接库的加载过程中出现的,所以错误消息并没有说错对齐,但是标准“找不到PInvoke DLL”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24958463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档