C#程序和C++ DLL针对32位系统编译,在64位系统上崩溃

3

我有一个C#应用程序,使用了一个DLL,因为我需要C++来访问一些user32 API的非托管功能(我无法使用PInvoke实现)。我将应用程序和DLL都编译为x86体系结构,在Windows 7 32位上一切正常。问题是,在Windows 7 64位上,当我尝试使用依赖于DLL的功能时,应用程序会崩溃(但其他所有内容都正常)。

我怀疑这是32/64位问题,所以我尝试重新编译x64体系结构的DLL,现在我可以在运行时选择要加载的DLL,包括x86和x64之间。但当我尝试使用依赖于DLL的功能时,它仍然会崩溃(因为我试图将64位DLL加载到32位程序中,这是有道理的)。我还没有尝试过将应用程序和DLL都编译为x64。我认为它会起作用,但这需要我有两个不同的安装程序,而我不想这样做。有任何线索吗?


如果两者都编译为x86,它应该可以工作。你能在64位系统上调试它并提供更多细节吗? - Henrik
我用于测试的64位系统是朋友的电脑。为了调试它,我需要在vmware或vbox中安装Windows 7 64位,这是可以做到的,但是设置需要一些时间。 - Manu
你在64位系统上有32位的CRT DLL吗? - Chris O
是的,我确实有32位CRT DLL文件。 - Manu
1个回答

2

当与非托管代码进行互操作时,您需要确保您的.Net应用程序在相同的子系统上运行(32位或64位)。如您所述,您加载的DLL是针对x86的,请强制.Net仅为x86平台构建。此设置可以在项目属性的“生成”选项卡中找到。默认值为任何CPU,将设置更改为x86以匹配您的非托管DLL,无论您在64位还是32位操作系统上运行,都应该可以正常运行。


我会在这个周末尝试,并在64位系统上进行测试。谢谢 :) - Manu
好的,问题解决了。我以为可执行文件是编译为x86的,但实际上它是作为“任何CPU”编译的,正如你所怀疑的那样,这是配置面板中给出的唯一选择。我不得不深入设置中找到x86和x64之间的选择。因此,我选择了x86而不是任何CPU,在Windows 7 64位上进行测试时,程序可以工作!嗯,DLL内部的功能没有正常工作,但至少程序启动并且不再出现任何错误消息。所以我会采纳这个答案 :) 谢谢Nathan! - Manu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接