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


204

在此处输入图片说明

我不清楚编译器在需要时如何自动知道要针对64位进行编译。它如何知道何时可以自信地瞄准32位?

我主要是好奇编译器在编译时如何知道要针对的体系结构。它会分析代码并根据发现的内容做出决策吗?



嗯谢谢 以前没看到过。我仍然对编译器如何自动知道要针对的体系结构感到好奇。有任何想法吗?
亚伦2012年

Answers:


219

微软有一个博客条目,从.NET 4.5和Visual Studio 11开始,AnyCPU的真正含义

在.NET 4.5和Visual Studio 11中,奶酪已被移动。对于大多数.NET项目,默认值仍然是AnyCPU,但是AnyCPU现在有多个含义。有一个附加的AnyCPU子类型,“首选任何32位CPU”,这是新的默认设置(总体而言,/ platform C#编译器开关现在有五个选项:x86,Itanium,x64,anycpu和anycpu32bitpreferred )。当使用AnyCPU的“首选32位”格式时,语义如下:

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

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


12
+1。此外,仅对.NET 4.5+可执行项目启用“首选32位”复选框。
Lee Grissom

12
首选anycpu32bit的另一个优点是,另一个以64位运行的.exe可以加载该程序集。
Bruno Martinez 2013年

30
我个人认为这是可怕的,他们默认情况下设置了此功能,而没有“工具”设置将其关闭。更糟糕的是,除非关闭,否则您将无法搜索它,因为它不在csproj文件中!由于Office Automation与x64机器上的CPUAny不兼容,并且大多数人都安装了32位Office,因此可能添加了它。
Dave

6
@BrianDavidBerman,如果将false设置为32但首选,并在64位计算机上设置x64或Any CPU,则为@BrianDavidBerman。
Lex Li

6
x86与首选的32位CPU之间的区别是,在后一种情况下,在可执行文件上设置了bigaddressaware标志。这意味着,在64位OS上运行的32位进程可以在x86模式下使用2GB内存,在Any CPU 32位首选模式下使用4GB内存。
Nic

6

这是一个简单的答案:

应用程序拱门。

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


2
“以32位运行”与以“ WoW64”运行之间有什么区别?我以为WoW64 =“ Windows64上的Windows(32位)”,任何32位应用程序都需要运行它。
彼得·科德斯

有这个来源吗?似乎其他任何地方仍然告诉我默认值是anycpu32bitpreferred,这与在64位Windows机器上运行的人们有很大的不同(很多)。
Ran Sagy

@RanSagy您可以通过创建一个新项目并进行检查来简单地对其进行测试Project -> Properties -> Build tab -> Platform target...,但是请注意,该AnyCPU-32bitPreferred功能仅在.Net 4.5及更高版本中可用。这就是默认值为的原因AnyCPU
Yousha Aleayoub

在某些情况下,我的是灰色的。我只是希望有一些有关.net 4.5+或.net标准/核心(或者实际上是MSBuild 16)中发生的情况的文档
Ran Sagy

-1

原因是:如果您不想在64位应用程序中使用更多的内存。这意味着,如果您的应用程序是AnyCPU,则希望以32位运行。

要添加更多内容,Visual Studio中的设置将针对特定的CLR:

Visual Studio在x86计算机上安装CLR的32位版本,并在64位Windows计算机上安装CLR的32位版本和适当的64位版本。(因为Visual Studio是32位应用程序,所以当它安装在64位系统上时,它将在WOW64下运行。)

请参阅文章64位应用程序MSDN)。


1
我不确定那是正确的。依我所知,.NET可执行文件(无论是32还是64)仍然限制为每个进程2 GB左右。
JP理查森

1
编辑了我的答案。但不能确定这是否是您要寻找的:)
秘鲁

2
@Aaron,编译器实质上是为运行时设置标志,以决定是否可以加载程序集(即,阻止在x64进程中加载​​仅x86的程序集)以及如何基于标志启动进程(对于新EXE)。我相信两种口味的IL都是一样的。
阿列克谢·莱文科夫

1
@JPRichardson是的,您是对的。但是在.net 4.5中,您可以选择增加大小。参考MSDN
秘鲁

40
@JPRichardson,无论是32位还是64位.Net可执行文件,每个进程都不能限制为2GB-首先,每个进程的地址空间是操作系统级别限制(32位进程为2/3 + GB,64位则更多),第二个甚至32位版本也可以如果在可执行文件上设置了“ LargeAddressAware”标志,则使用2GB以上的内存。我知道的唯一2GB限制是有关受Int32范围限制的阵列/分配大小(约2GB)。
阿列克谢·莱文科夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.