【发布时间】:2011-11-11 13:35:42
【问题描述】:
这个问题与之前关于 SO 的问题有关
Any CPU question 1 和 Any CPU Question 2
我有一个最初使用 Visual Studio 2005 在 Win XP 上构建的应用程序(别笑!)。这个应用程序调用了我们的 win32 C++ dll。调用 C++ dll 的 C# 组件是使用“Any CPU”配置构建的,并且在 Win XP 上运行愉快,没有任何问题。
我们现在正在迁移到 Win 7,并且我们的应用程序的发布版本(基于 Win XP 和 VC 2005 构建)运行良好。然而,随着向我们的用户推出 win 7,我们现在有机会迁移到 VS 2010,并且我已经使用 VC 2010 在 win 7 上构建了 C# 组件,但是现在在运行这个版本时,我得到很多“无法加载 abc。 dll”,其中 abc.dll 是我们的 win32 c++ 组件。
我知道使用 x86 配置重新编译 C# 程序集可以解决问题,但我不明白的是使用 Win-XP/Visual Studio 2005(任何 CPU 配置)构建的发行版 c# 程序集如何能够运行Win 7没有任何问题?当然,这些使用“任何 CPU”构建的 C# 程序集在 Win 7 中加载时应该 JIT 到 64 位代码,并导致 BadImageFormatException 或其他错误,因为它们调用 Win32 C++ dll。
更新:我在下面的 cmets 中要求提供更多信息。
在我的 Windows 7 机器上,我右键单击我的计算机并查看属性。系统信息显示“系统类型:64 位操作系统”,确认这是 Win64 操作系统。
-
在 Windows XP 的 VC2005 中打开解决方案 查看解决方案的配置管理器时,我可以确认 所有 C# 项目是平台类型“任何 CPU”。
在 64 位 Win 7 机器上运行发布版本(在 VC2005/win xp 上完成)时,我的任务管理器显示图像名称为“Test.exe *32”,这确认它是 jit'd并加载到 32 位进程中。
【问题讨论】:
-
两种情况下的目标环境位数是否相同?这可能是另一个偷偷摸摸的变化?
-
这里发生了一些你没有告诉我们的事情。 AnyCPU 程序集将是 64 位系统上的 64 位进程。它在哪里建造并不重要。
-
只有 EXE 项目上的平台目标设置很重要,它决定了进程的位数。请注意,构建 + 配置管理器中的活动平台选择不适用于托管项目。
-
哦哦!从 XP/VS2005 组合执行构建时,使用 Windows 7 中的任务管理器检查位数。如果您的 exe 加载了 *32,则为 32 位,如果不是,则为 64 位。让我们知道 XP/VS2005 构建是作为 32 位还是 64 位执行的。
-
您确定原始版本运行的 Windows 7 系统是 64 位系统吗?毕竟,并非所有的 Windows 7 安装都是 64 位的。
标签: c#