【问题标题】:Visual Studio: "Target CPU" setting in "Advanced Compiler Settings". What does it do?Visual Studio:“高级编译器设置”中的“目标 CPU”设置。它有什么作用?
【发布时间】:2011-05-12 03:18:17
【问题描述】:

Visual Studio 2010(付费版)为 .NET 程序提供了四种目标 CPU 的选择:AnyCPU、x86、x64 和 Itanium。

这些设置到底有什么作用?

我注意到(在 x64 Windows 7 机器上),使用 AnyCPU 和 x86 创建的二进制文件大小相同,使用 x64 或 Itanium 创建的二进制文件大小相同(但比第一个小)。为 x86 创建的二进制文件似乎也可以在 WoW64 中运行,而为 AnyCPU 编译的相同大小的二进制文件则不能。针对 Itanium 优化的二进制文件根本无法在 Windows 7 x64 上运行(这是有道理的)。

我假设 Windows 以任何本机模式运行 AnyCPU 二进制文件(在我的情况下为 x64),并在 64 位机器(x64 和 Itanium)上在 WoW64 中运行 x86。但是二进制大小是怎么来的呢?

【问题讨论】:

    标签: .net visual-studio


    【解决方案1】:

    任何 CPU 都允许应用程序或库作为 64 位进程或 32位进程,取决于操作系统的位数 启动。

    x86 应用程序将始终作为 32 位应用程序运行,无论位数如何 操作系统。

    x64 应用程序只能在 64 位操作系统上运行。这也是 有时称为 AMD64,因为 AMD 创建了这个 64 位指令集。

    Itanium 用于 Itanium CPU。

    如果您有一个 Any CPU 应用程序并且它加载了一个 x86 库,则该应用程序 在 32 位 Windows 下可以工作,但在 64 位 Windows 下会抛出异常。

    当您为您的应用程序或库指定架构时,您就是 告诉框架你的应用程序只能使用它 建筑学。例如,如果您的应用程序执行特定的操作 对于 x86 架构,您要确保它没有加载到 64 位 进程或安腾进程。您可以通过设置目标 CPU 来做到这一点。

    如果您执行特定于 x86 架构的操作并编译到任何 CPU 您的应用程序将在 32 位窗口下运行,因为 .NET 运行时将在 32位模式。如果您的应用程序在 64 位操作系统或安腾操作系统下运行 运行时将查看您的应用程序是否看到 AnyCPU 并尝试使用本机 64 位 代码。您的应用程序将失败。如果您指定 x86,则运行时将 以 32 位模式启动,您的应用程序将正常运行。

    该设置告诉框架在哪些架构下可以安全运行。

    实际发生的是设置了应用程序的一些元数据 不同。您可以使用 dumpbin.exe 查看此信息这是一个示例 AnyCPU 库的输出

    bin\Debug>dumpbin /CLRHEADER bitnesstest.dll Microsoft (R) COFF/PE 翻车机版本 10.00.30319.01 版权所有 (C) 微软公司。版权所有。 文件 bitnesstest.dll 的转储 文件类型:DLL clr 标题: 48 立方 2.05 运行时版本 2058 [ 5D0] 元数据目录的 RVA [大小] 1 个标志 仅限伊利诺伊 0 入口点令牌 0 [ 0] 资源目录的 RVA [大小] StrongNameSignature 目录的 0 [ 0] RVA [大小] CodeManagerTable 目录的 0 [ 0] RVA [大小] VTableFixups 目录的 0 [ 0] RVA [大小] ExportAddressTableJumps 目录的 0 [ 0] RVA [大小] 0 [ 0] ManagedNativeHeader 目录的 RVA [大小]

    和一个 x86 库

    bin\Debug>dumpbin /CLRHEADER bitnesstest.dll Microsoft (R) COFF/PE 翻车机版本 10.00.30319.01 版权所有 (C) 微软公司。版权所有。 文件 bitnesstest.dll 的转储 文件类型:DLL clr 标题: 48 立方 2.05 运行时版本 2058 [ 5D0] 元数据目录的 RVA [大小] 3 个标志 仅限伊利诺伊州 需要 32 位 0 入口点令牌 0 [ 0] 资源目录的 RVA [大小] StrongNameSignature 目录的 0 [ 0] RVA [大小] CodeManagerTable 目录的 0 [ 0] RVA [大小] VTableFixups 目录的 0 [ 0] RVA [大小] ExportAddressTableJumps 目录的 0 [ 0] RVA [大小] 0 [ 0] ManagedNativeHeader 目录的 RVA [大小]

    要显示 x64 和 IA64 - Itanium 之间的区别,您可以将 dumpbin 与 /HEADERS 开关。 /CLRHEADERS 与在 厘米。

    【讨论】:

    • 我已经说过了。但问题是,这个设置有什么作用?
    • 当我在技术网站上询问微波炉的工作原理时,我不希望得到像“你把食物放进去然后它会加热”这样的回答。
    • 我想我已经告诉你肉现在是如何加热的了。使用 dumpbin.exe 查看您的应用程序或 dll 以了解设置在做什么。
    • IA64 和 x64 的 CLR 标头完全相同。这还不是全部。
    • 可以使用/HEADERS查看(x64)或(IA64)
    【解决方案2】:

    来自MSDN:

    Target CPU(C# 中的平台目标)项目属性指定编译器是否应针对特定 CPU 类型(例如 64 位处理器)优化编译。您可以将目标平台设置为所有 CPU 类型或 x86、x64 或 Itanium 的特定 CPU 类型。默认情况下,此选项设置为 AnyCPU(C# 中的任何 CPU),它指定编译器不应针对特定 CPU 类型优化编译。

    【讨论】:

    • 这是一个更好的答案,但我已经找到了关于它的 MSDN 文章。我仍然想知道“优化”是什么意思,特别是因为 anycpu 和 x86 大小相同,x64 和 ia64 大小相同。
    【解决方案3】:

    AnyCPU 导致 JIT 在代码被 JIT 的机器架构中运行代码。

    将其设置为任何特定架构将导致它被构建为仅由该特定架构中的 JIT 运行。

    至于为什么任何 CPU 不能在 64 位机器上的 WOW64 下运行,这是因为这是针对 x86 二进制文件,而您的二进制文件则以 x64 格式执行。

    【讨论】:

    • 那到底是什么?设置操作系统检查?特定于架构的代码?它是如何工作的?
    【解决方案4】:

    顺便说一句,更改 CPU 选项也会将编译代码的调试/发布版本的默认位置从 path\bin\debug 更改为 path\bin\x86\debug 等。您可能需要删除 path\bin \debug 和 path\bin\release 目录,以防止意外抓取应用程序的真正旧版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多