Memory 将嵌入式Dll从eVC移植到VS2008会导致找不到Dll 我试图将一个非托管C++ DLL从一个嵌入式设备移植到另一个嵌入式设备上,并且面临一些奇怪的问题,我认为这些问题与内存管理和/或编译器有一定的关系。我没有发布太多的代码,但请描述我尝试了什么,因为我尝试了太多不同的东西来发布所有代码,我认为问题一定在更深层次 第一个设备运行WinCE 5,并使用嵌入式Visual C++ 4编译。 第二个设备运行的是Windows Embedded Compact 7,为了简单起见,我将其称为WinCE 7,并使用VS2008编译。这两款设备都有自己为主板设计的SDK

Memory 将嵌入式Dll从eVC移植到VS2008会导致找不到Dll 我试图将一个非托管C++ DLL从一个嵌入式设备移植到另一个嵌入式设备上,并且面临一些奇怪的问题,我认为这些问题与内存管理和/或编译器有一定的关系。我没有发布太多的代码,但请描述我尝试了什么,因为我尝试了太多不同的东西来发布所有代码,我认为问题一定在更深层次 第一个设备运行WinCE 5,并使用嵌入式Visual C++ 4编译。 第二个设备运行的是Windows Embedded Compact 7,为了简单起见,我将其称为WinCE 7,并使用VS2008编译。这两款设备都有自己为主板设计的SDK,memory,compiler-construction,embedded,global-variables,porting,Memory,Compiler Construction,Embedded,Global Variables,Porting,在第一台设备上,Dll运行没有任何问题,但在第二台设备上,新SDK编译的Dll不工作。在第二台设备上使用C应用程序时,我尝试PInvoke访问dll,但在调试模式下的PInvoke行上收到错误消息: 找不到PInvoke DLL NAME.DLL 我了解到此错误可能有不同的原因: 缺少要调用的本机库的依赖项。 本机assmebly是为错误的子系统(即桌面,而不是CE)编译的 本机程序集是为错误的处理器(即x86而非ARM)编译的 虚拟内存不足,无法加载DLL。 我使用peinfo检查dll。所有

在第一台设备上,Dll运行没有任何问题,但在第二台设备上,新SDK编译的Dll不工作。在第二台设备上使用C应用程序时,我尝试PInvoke访问dll,但在调试模式下的PInvoke行上收到错误消息:

找不到PInvoke DLL NAME.DLL

我了解到此错误可能有不同的原因:

缺少要调用的本机库的依赖项。 本机assmebly是为错误的子系统(即桌面,而不是CE)编译的 本机程序集是为错误的处理器(即x86而非ARM)编译的 虚拟内存不足,无法加载DLL。 我使用peinfo检查dll。所有依赖项都在设备上找到,它是为WinCE 7编译的,处理器类型正确。如果不是,我会感到惊讶,因为使用了正确的SDK,所以仍然存在第4个问题:虚拟内存不足。但是WinCE5的虚拟内存限制为32MB,并且在运行,而WinCE7的虚拟内存最高可达2GB? 所以我开始尝试一些方法来缩小误差,我会告诉你我的结果

首先,我获取了为第一台设备编译的dll,并尝试在第二台设备上使用它。令人惊讶的是.net应用程序可以找到并PInvoke这个。但是Dll中的一些函数似乎运行不正常,所以我想我必须使用正确的SDK。但是有两个dll的正确代码,我知道导出必须是正确的。我知道这两个编译器使用不同的C++名字处理样式,所以也不是问题。 接下来,我用新的SDK在VS2008上编写了一个简单的C++应用程序,从那里加载Dll。在第一台设备上,应用程序以这种方式运行,但现在在第二台设备上运行时,在我的远程显示器上,我收到错误消息:

无法导入库名称.dll!程序将退出

至少现在我知道它与.net和PInvoke无关。但进一步说,我使用VS2008创建了一个简单的新dll,新的SDK和ne.net应用程序能够PInvoke它。因此,代码中一定有不喜欢加载的内容:-/

经过几个小时的代码搜索,我意识到系统不喜欢某些全局变量。我知道全局变量是不好的,如果它们不存在,我会很高兴,但我还没有开始编写代码,多年来,在我处理它之前,它们变得越来越多,所以现在很难删除它们

这些全局变量是类的实例。他们中的一些人看起来很糟糕,另一些人看起来还行。令人困惑的是,它们都是类的实例,我不知道为什么会有好的和坏的。当我注释掉不好的全局变量时,应用程序能够PInvoke Dll。其中一个坏的全局变量足以使applikation无法找到Dll


为什么将VS2008与WinCE 7一起使用,而不将eVC4.0与WinCE 5一起使用?环球队有什么问题?我怎样才能解决这个问题?充其量,相同的代码应该适用于两个编译器,但首先我需要一些想法,第二个编译器有什么问题。

我找到了Dll加载问题的解决方案。这两个系统在pragma pack上有不同的行为。因此,最终在加载dll时出现了错误对齐,这导致dll崩溃。由于全局性,它处于dll的加载过程中,因此错误消息没有说明对齐错误,但标准无法找到PInvoke dll。

您能否至少在工作系统上计算出最终的内存占用有多大,以及是否浪费了一些内存?你能通过实验切割出零件直到它工作,从而发现问题出在哪一部分吗?你能在那里找到一个调试器并跟踪加载过程以确定故障点吗?在工作的WinCE 5系统上,32mb虚拟内存中大约有20mb被使用。我试着剪掉部分,然后就这样来到了环球。其中一些似乎导致了这个问题,但剥离实例化为globals的类并没有弄清楚原因。它们剩下的不多了,但还有一些基本的变量。当他们中的一些人被切断时,它就起作用了。。。在某些情况下,我可以添加一个integer membervariable使其工作,但如果没有integer,它就无法工作。。。
所以这对我来说非常混乱。为了测试,我将globals封装到一个单例类中。声明此单例类引发错误时程序存在:Multiserver.exe中发生本机异常。选择退出然后重新启动此程序,或选择详细信息以了解更多信息。详细信息:错误异常代码:0x8000002异常地址:0x4382a214故障模块:NAME.dll偏移量:0x0001A14