我想大多数重要的东西已经说过了,但我只是想添加一件事:如果你编译为 Any CPU 并在x64平台上运行,那么你在WOW64中赢得了't be able to load 32-bit dlls, because your app wasn' t,但那些dll需要在那里运行 . 如果您编译为x86,那么x64系统将在WOW64中运行您的应用程序,并且您将能够加载32位dll . 所以我认为你应该选择"Any CPU"如果您的依赖项可以在任一环境中运行,但如果您有32位依赖项,请选择x86 . 微软的这篇文章解释了这一点:
8 回答
AnyCPU 程序集在加载到64位进程时将JIT转换为64位代码,在加载到32位进程时将转换为32位 .
通过限制CPU,你会说:组件使用的东西(可能是非托管的)需要32位或64位 .
我想大多数重要的东西已经说过了,但我只是想添加一件事:如果你编译为 Any CPU 并在x64平台上运行,那么你在WOW64中赢得了't be able to load 32-bit dlls, because your app wasn' t,但那些dll需要在那里运行 .
如果您编译为x86,那么x64系统将在WOW64中运行您的应用程序,并且您将能够加载32位dll .
所以我认为你应该选择"Any CPU"如果您的依赖项可以在任一环境中运行,但如果您有32位依赖项,请选择x86 . 微软的这篇文章解释了这一点:
/CLRIMAGETYPE (Specify Type of CLR Image)
顺便提一下,this other Microsoft documentation同意x86通常是一个更便携的选择:
这是一个quick overview,它解释了不同的构建目标 .
根据我自己的经验,如果您正在构建一个可在x86和x64平台上运行的项目,并且您没有任何特定的x64优化,我会将构建更改为具体说“x86” .
这样做的原因有时你可能会得到一些碰撞的DLL或一些代码在x64环境中崩溃WOW . 通过专门指定x86,x64操作系统将把应用程序视为纯x86应用程序,并确保一切顺利运行 .
看看文章Visual Studio .NET Platform Target Explained .
据报道上述链接已被破坏,因此这里有另一篇文章,其中有类似的解释:What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11
“任何CPU”意味着当程序启动时,.NET Framework将根据OS位数确定是以32位还是64位运行程序 .
x86和任何CPU之间存在差异:在x64系统上,为X86编译的可执行文件将作为32位可执行文件运行 .
至于您的怀疑,只需转到Visual Studio 2008命令行并运行以下命令 .
它会告诉你程序的位数,还有更多 .
任何CPU都意味着它可以在任何平台上运行 . 这是因为托管代码与Java类似 . 可以将其视为编译为.NET Framework在运行时解释的字节代码 .
C没有此选项,因为它被编译为特定于平台的机器代码 .
相信预订“通过C#CLR”,请看:
https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38
我建议读这个post.
使用AnyCPU时,语义如下: