Visual Studio“任何CPU”目标是什么意思?

时间:2009-02-05 16:43:27

标签: .net visual-studio-2008 build 64-bit

我对Visual Studio 2008中的.NET平台构建选项有一些困惑。

什么是“任何CPU”编译目标,它会生成什么类型​​的文件?我检查了这个“Any CPU”构建的输出可执行文件,发现它们是x86可执行文件(谁也看不到它!)。那么,将可执行文件定位到x86与“任何CPU”之间有什么区别吗?

我注意到的另一件事是托管C ++项目没有这个平台作为选项。这是为什么?这是否意味着我怀疑“任何CPU”可执行文件是普通的32位可执行文件是对的吗?

8 个答案:

答案 0 :(得分:360)

AnyCPU 程序集在加载到64位进程时将JIT转换为64位代码,在加载到32位进程时将转换为32位。

通过限制CPU你会说:程序集正在使用某些东西(很可能 非托管的,需要32位或64位。

答案 1 :(得分:295)

我认为大部分重要内容都已经说过,但我只是想添加一件事:如果编译为任何CPU 并在x64平台上运行,那么你就不会能够加载32位dll,因为你的应用程序没有在WOW64中启动,但那些dll需要在那里运行。
如果你编译为x86,那么x64系统将在WOW64中运行你的应用程序,你将能够加载32位dll。
因此,如果您的依赖项可以在任一环境中运行,我认为您应该选择“任何CPU”,但如果您有32位依赖项,则选择x86。微软的这篇文章解释了这一点:

/CLRIMAGETYPE (Specify Type of CLR Image)

顺便说一句,this other Microsoft documentation同意x86通常是一个更便携的选择:

  

选择x86通常是应用程序包的最安全配置   因为它几乎可以在所有设备上运行。在某些设备上,一个应用程序   使用x86配置的软件包将无法运行,例如Xbox或其他软件包   物联网核心设备。但是,对于PC来说,x86软件包是最安全的   选择并具有最大的设备部署范围。实质性的   部分Windows 10设备继续运行x86版本   视窗。

答案 2 :(得分:50)

这是解释不同构建目标的quick overview

根据我自己的经验,如果您正在构建一个可在x86和x64平台上运行的项目,并且您没有任何特定的x64优化,我会将构建更改为具体说“x86”。 “

原因有时候你可能会遇到一些碰撞的DLL或一些在x64环境中崩溃WOW的代码。通过专门指定x86,x64操作系统将把应用程序视为纯x86应用程序,并确保一切顺利运行。

答案 3 :(得分:45)

查看文章 Visual Studio .NET Platform Target Explained

  

默认设置“任何CPU”表示程序集将运行   它本身正在运行的CPU上。意思是,它会运行   在64位计算机上为64位,在32位计算机上为32位。如果   从64位应用程序调用程序集,它将作为一个   64位汇编等等。

据报道,上述链接已被删除,因此这是另一篇文章,其中有类似的解释: What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

答案 4 :(得分:39)

“任何CPU”意味着当程序启动时,.NET Framework将根据OS位数确定是以32位还是64位运行程序。

x86 任何CPU 之间存在差异:在x64系统上,为X86编译的可执行文件将作为32位可执行文件运行。

就您的怀疑而言,只需转到Visual Studio 2008命令行并运行以下命令。

dumpbin YourProgram.exe /headers

它会告诉你程序的位数,还有更多。

答案 5 :(得分:33)

通过C#"预订" CLR,请参阅:

https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38

enter image description here

答案 6 :(得分:31)

任何CPU都意味着它可以在任何平台上运行。这是因为托管代码类似于Java。可以将其视为编译为.NET Framework在运行时解释的字节代码。

C ++没有此选项,因为它被编译为特定于平台的机器代码。

答案 7 :(得分:4)

我建议您阅读此post.

使用AnyCPU时,语义如下:

  
      
  • 如果进程在32位Windows系统上运行,则它将以32位进程运行。 IL编译为x86机器代码。
  •   
  • 如果进程在64位Windows系统上运行,则它将以32位进程运行。 IL编译为x86机器代码。
  •   
  • 如果进程在ARM Windows系统上运行,则它将以32位进程运行。 IL编译为ARM机器代码。
  •