【问题标题】:What is the purpose of the "Prefer 32-bit" setting in Visual Studio and how does it actually work?Visual Studio 中“首选 32 位”设置的目的是什么?它实际上是如何工作的?
【发布时间】:2012-08-17 11:51:02
【问题描述】:

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

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

【问题讨论】:

标签: c# .net visual-studio compilation cpu-architecture


【解决方案1】:

微软有一篇博文What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

在 .NET 4.5 和 Visual Studio 11 中,奶酪已被移动。这 大多数 .NET 项目的默认值仍然是 AnyCPU,但有超过 现在对 AnyCPU 的一种意义。 AnyCPU还有一个额外的子类型, “任何 CPU 32 位首选”,这是新的默认设置(总体而言,有 现在是 /platform C# 编译器开关的五个选项:x86, Itanium、x64、anycpu 和 anycpu32bit 优先)。使用“首选 32 位”时 AnyCPU的味道,语义如下:

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

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

【讨论】:

  • +1。此外,“首选 32 位”复选框仅对 .NET 4.5+ 可执行项目启用。
  • anycpu32bitspreferred 的另一个优点是另一个以 64 位运行的 .exe 可以加载该程序集。
  • 就我个人而言,我认为他们在默认情况下设置此设置而没有工具设置将其关闭是很可怕的。更糟糕的是,除非关闭,否则您无法在 csproj 文件中搜索它!可能是因为 Office 自动化与 x64 机器上的 CPUAny 不兼容,大多数人安装 32 位 Office。
  • @BrianDavidBerman 有,如果您将 false 设置为 32-但首选并在 64 位机器上设置 x64 或 Any CPU。
  • x86 和 Any CPU 32 位首选的区别在于,在后一种情况下,在可执行文件上设置了 largeaddressaware 标志。这意味着在 64 位操作系统上运行的 32 位进程在 x86 模式下可以使用 2GB 内存,在 Any CPU 32 位首选模式下可以使用 4GB 内存。
【解决方案2】:

这里有一个简单的答案:

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

【讨论】:

  • “以 32 位运行”与以“WoW64”运行有什么区别。我认为 WoW64 = "Windows (32-bit) o​​n Windows64" 是运行任何 32 位应用程序所必需的。
  • 这个有来源吗?似乎其他地方仍然告诉我默认值是 anycpu32bitpreferred,这与在 64 位 Windows 机器上运行的人有很大的不同(很多)。
  • @RanSagy 您可以通过创建一个新项目并检查 Project -> Properties -> Build tab -> Platform target... 来简单地对其进行测试,但请注意 AnyCPU-32bitPreferred 仅在 .Net 4.5 及更高版本中可用。这就是为什么默认是AnyCPU
  • 在某些情况下,我的是灰色的;我只是希望有一些关于 .net 4.5+ 或 .net 标准/核心(或者实际上是 MSBuild 16)中发生的事情的文档
【解决方案3】:

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

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

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

请参考文章64-bit Applications (MSDN)。

【讨论】:

  • 我不确定这是否准确。因为,据我了解,.NET 可执行文件(无论是 32 还是 64)仍然限制在每个进程 2 GB 左右。
  • 编辑了我的答案。但不确定这是否是你要找的:)
  • @Aaron,编译器本质上为运行时设置标志,以决定是否可以加载程序集(即阻止 x86-only 程序集在 x64 进程中加载​​)以及如何启动进程(对于新的 EXE ) 基于标志。我相信两种口味的 IL 都是一样的。
  • @JPrichardson,32 位和 64 位 .Net 可执行文件都限制为每个进程 2GB - 首先每个进程的地址空间是操作系统级别的限制(2/3+GB 用于 32 位进程,更多用于64 位),如果在可执行文件上设置了“LargeAddressAware”标志,则第二个甚至 32 位版本也可以使用超过 2GB。我知道的唯一 2GB 限制是关于受 Int32 范围(约 2GB)限制的数组/分配大小。
  • 在 64 位操作系统上以 32 位运行会影响性能。例如,我注意到双重和长时间的操作需要更长的时间。
猜你喜欢
  • 2010-11-03
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多