【问题标题】:C# program and C++ DLL compiled for 32-bit system crash on 64-bit system为 32 位系统编译的 C# 程序和 C++ DLL 在 64 位系统上崩溃
【发布时间】:2011-05-26 10:57:45
【问题描述】:

我有一个使用 DLL 的 C# 应用程序,因为我需要 C++ 来访问 user32 API 的一些非托管功能(我不能为此使用 PInvoke)。我为 x86 架构编译了应用程序和 DLL,并且在 Windows 7 32 位上一切正常。现在的问题是,在 Windows 7 64 位上,当我尝试使用依赖 DLL 的功能时应用程序崩溃(但其他所有功能都可以正常工作)。

我怀疑这是 32/64 位问题,所以我尝试为 x64 架构重新编译 DLL,现在我可以在运行时选择在 x86 和 x64 之间加载哪个 DLL。但是当我尝试使用依赖于 DLL 的功能时它仍然崩溃(这很有意义,因为我尝试将 64 位 DLL 加载到 32 位程序中)。我还没有尝试为 x64 编译应用程序和 DLL。我怀疑它会起作用,但是它需要我有两个不同的安装程序,我不想去那里。有什么线索吗?

【问题讨论】:

  • 如果两者都是为 x86 编译的,它应该可以工作。能否在 64 位系统上调试并提供更多详细信息?
  • 我用来测试的64位系统是朋友的电脑。要调试它,我需要在 vmware 或 vbox 中安装 Windows 7 64 位,我可以这样做,但设置它需要一些时间。
  • 在 64 位系统上有 32 位 CRT DLL 吗?
  • 是的,我有 32 位 CRT DLL

标签: c# c++ windows dll 32bit-64bit


【解决方案1】:

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

【讨论】:

  • 这个周末我会试试,我会在 64 位系统上测试。谢谢:)
  • 好的,成功了。我以为可执行文件被编译为 x86,但实际上它被编译为“任何 CPU”,正如您所怀疑的那样,这是配置面板列表中给我的唯一选择。我必须深入设置才能找到 x86 和 x64 之间的选择。所以我选择了 x86 而不是 Any CPU,并且在 Windows 7 64 位上进行测试时,该程序运行正常!好吧,DLL 内部的功能无法正常工作,但至少程序启动并且不再提供任何错误消息。所以我要接受这个答案:) 谢谢内森!
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 2023-03-20
  • 2011-11-11
  • 2012-03-16
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多