我对Visual Studio 2008中.NET平台的构建选项感到困惑。
"Any CPU"编译目标是什么,它生成什么样的文件?我检查了这个“Any CPU”版本的输出可执行文件,并发现它们是x86可执行文件(谁不会看出来呢!)。那么,将可执行文件定位到x86与“Any CPU”有什么区别吗?
我还注意到另一件事,那就是托管C++项目没有这个平台选项。为什么会这样?这是否意味着我对“Any CPU”可执行文件是32位纯净版的怀疑是正确的?
我对Visual Studio 2008中.NET平台的构建选项感到困惑。
"Any CPU"编译目标是什么,它生成什么样的文件?我检查了这个“Any CPU”版本的输出可执行文件,并发现它们是x86可执行文件(谁不会看出来呢!)。那么,将可执行文件定位到x86与“Any CPU”有什么区别吗?
我还注意到另一件事,那就是托管C++项目没有这个平台选项。为什么会这样?这是否意味着我对“Any CPU”可执行文件是32位纯净版的怀疑是正确的?
AnyCPU组件将在加载到64位进程时JIT为64位代码,而在加载到32位进程时则为32位。
通过限制CPU,您会说:“该组件正在使用某些(可能是未管理的)东西,需要32位或64位。”
我认为大部分重要内容已经被讨论了,但我想补充一点:如果你编译成 Any CPU 并在 x64 平台上运行,则无法加载 32 位 DLL 文件,因为你的应用程序没有在 WoW64 中启动,而这些 DLL 文件需要在那里运行。
如果你编译为 x86,则 x64 系统将在 WoW64 中运行你的应用程序,你就可以加载 32 位 DLL 文件。
所以我认为如果你的依赖项可以在任何环境中运行,那么你应该选择 "Any CPU",但如果你有 32 位依赖项,则应该选择 x86。 这篇来自微软的文章对此进行了解释:
/CLRIMAGETYPE (Specify Type of CLR Image)
顺便说一句,这份其他的微软文档也同意 x86 通常是更具可移植性的选择:
由于几乎可以在任何设备上运行,因此选择 x86 通常是应用程序包的最安全配置。在某些设备上,使用 x86 配置的应用程序包无法运行,例如 Xbox 或某些 IoT Core 设备。但是,对于 PC,x86 包是最安全的选择,并且具有最大的设备部署范围。相当一部分 Windows 10 设备继续运行 Windows 的 x86 版本。
请查看文章Visual Studio .NET 平台目标解释。
默认设置为“Any CPU”,意味着程序集将在当前运行的CPU上本地运行。也就是说,它将在64位机器上作为64位运行,在32位机器上作为32位运行。如果程序集是从64位应用程序中调用的,则会作为64位程序集执行,以此类推。
上面的链接已经报告失效,这里提供另一篇类似的文章:.NET 4.5和Visual Studio 11下 AnyCPU 的真正含义
"Any CPU" 表示当程序启动时,.NET Framework会根据操作系统的位数来确定是否以32位或64位运行你的程序。
x86 和 Any CPU 之间有区别:在x64系统上,编译为X86的可执行文件将作为32位可执行文件运行。
关于你的怀疑,只需要在Visual Studio 2008命令行中运行以下命令。
dumpbin YourProgram.exe /headers
它将告诉您程序的位数,以及更多的信息。
Any CPU表示它可以在任何平台上运行。这是因为托管代码类似于Java。将其编译为字节码,由.NET框架在运行时解释。
C++没有此选项,因为它被编译为特定于平台的机器代码。
x86
来解决这个问题。(从启动项目引用的程序集可能仍然针对Any CPU
进行目标设置。) - Cristian Diaconescux86
库被AnyCPU
应用程序消费时,我不得不设置Prefer 32-bit
以避免加载错误。 - SteveCinq