【问题标题】:Build platform target AnyCPU EXE still shows 32bit header in 64bit machine构建平台目标 AnyCPU EXE 在 64 位机器上仍然显示 32 位标头
【发布时间】:2015-03-06 00:16:23
【问题描述】:

不确定以前是否有人问过这个问题(我找不到)。 我有简单的控制台应用程序/ESE 并具有以下设置。

我正在运行 Windows 8、63 位操作系统。和EXE目标框架.NET 4.5 但是,当我编译这个 EXE 时,它仍然显示为 32 位 EXE。

由于这是“任何 CPU”,我希望 EXE 编译为 64 位 / PE32+。

有人可以帮忙解释一下为什么这仍然是 32 位吗?

【问题讨论】:

    标签: c# visual-studio-2012 .net-4.5 32bit-64bit anycpu


    【解决方案1】:

    我认为你误解了CorFlags。这是一个CorFlags 真值表:

    CPU Architecture           PE      32BITREQ   32BITPREF
    ------------------------   -----   --------   ---------
    x86 (32-bit)               PE32           1           0
    x64 (64-bit)               PE32+          0           0
    Any CPU                    PE32           0           0
    Any CPU 32-Bit Preferred   PE32           0           1
    

    如您所见,如果您将其编译为 64 位而不是 Any CPU,它只会报告 PE32+。原因是标头必须向后兼容。这意味着如果程序集要在 32 位和 64 位的“任何 CPU”中工作,则标头格式必须采用 32 位操作系统可识别的格式。 PE32+ 是仅 64 位的标头格式,如果该标头应用于编译为 Any CPU 的程序集,则 32 位操作系统将无法识别 PE32+ 标头格式。

    【讨论】:

    • 有道理。非常感谢!
    【解决方案2】:

    exe文件不包含任何32位或64位代码,它只包含IL代码。

    JIT 编译器从 IL 代码创建机器码,平台目标决定了 JIT 编译器允许创建什么样的机器码。

    【讨论】:

    • 谢谢。如果“平台目标”决定了JIT编译器应该创建什么样的机器码,既然是AnyCPU,应该是64位吗?
    • @Spock:我不能成为 AnyCPU 的 64 位,因为 32 位系统必须能够从中创建 32 位代码。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2017-02-21
    相关资源
    最近更新 更多