Visual Studio中"首选32位"设置的目的是什么?它实际上是如何工作的?

Aar*_*ron 195 .net c# compilation cpu-architecture visual-studio

在此输入图像描述

我不清楚编译器在需要时如何自动知道编译为64位.它如何知道什么时候可以自信地针对32位?

我很好奇编译器在编译时如何知道要定位的架构.它是否分析代码并根据它发现的内容做出决定?

Lex*_* Li 213

微软有一个博客文章What AnyCPU真正意味着.NET 4.5和Visual Studio 11:

在.NET 4.5和Visual Studio 11中,奶酪已被移动.大多数.NET项目的默认设置是AnyCPU,但现在AnyCPU有多个含义.还有一个额外的子类型AnyCPU,"任何CPU 32位首选",这是新的默认值(总体而言,/ platform C#编译器交换机现在有五个选项:x86,Itanium,x64,anycpu和anycpu32bitpreferred ).当使用AnyCPU的"Prefer 32-Bit"风格时,语义如下:

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

然后,"任何CPU 32位首选"和"x86"之间的区别仅在于:编译为x86的.NET应用程序无法在ARM Windows系统上运行,而是"任何CPU 32位首选"应用程序将成功运行.

  • 就个人而言,我认为他们默认设置此项并且没有"工具"设置将其关闭是非常可怕的.更糟糕的是,你不能搜索它,因为不在csproj文件中,除非关闭!可能是因为Office自动化与x64计算机上的CPUAny不兼容而大多数人安装了32位Office. (29认同)
  • +1.此外,"Prefer 32-bit"复选框仅对.NET 4.5+可执行项目启用. (12认同)
  • anycpu32bitspreferred的另一个优点是以64位运行的另一个.exe可以加载该程序集. (12认同)
  • @BrianDavidBerman,如果你将false设置为32但是首选,并在64位机器上设置x64或Any CPU. (6认同)
  • x86和任何CPU 32位首选的区别在于,在后一种情况下,在可执行文件上设置了largeaddressaware标志.这意味着在64位操作系统上运行的32位进程可以在x86模式下使用2GB内存,在任何CPU 32位首选模式下使用4GB内存. (5认同)
  • 将默认值更改为首选 32 位是一个巨大的回归。 (3认同)
  • 作为 @Nic 声明的后续内容,这里有一篇文章,其中包含有关“首选 32 位”如何设置“IMAGE_FILE_LARGE_ADDRESS_AWARE”的更多信息:[“为什么‘任何 CPU(首选 32 位)’允许我在 . NET 4.5?”](/sf/ask/2454781661/) (2认同)

You*_*oub 13

这是一个简单的答案:

应用拱。

注意: AnyCPU-32bitPreferred 仅在 .Net 4.5 及更高版本中可用。

  • “以 32 位运行”与以“WoW64”运行有什么区别?我认为 WoW64 =“Windows64 上的 Windows(32 位)”并且任何 32 位应用程序的运行都需要它。 (3认同)
  • 这有来源吗?似乎其他地方仍然告诉我默认值是anycpu32bitpreferred,这对于在 64 位 Windows 机器上运行的人来说是一个巨大的差异(很多)。 (2认同)