构建平台目标 AnyCPU EXE 在 64 位机器上仍然显示 32 位 header
Build platform target AnyCPU EXE still shows 32bit header in 64bit machine
不确定之前有人问过这个问题(我找不到)。
我有简单的控制台 app/ESE 并具有以下设置。
我是 运行 Windows 8、63 位 OS。和 EXE 目标框架 .NET 4.5
但是,当我编译这个EXE时,它仍然显示为32位EXE。
因为这是 "Any CPU",我希望 EXE 编译为 64 位/PE32+。
有人能帮忙说说为什么这仍然是 32 位吗?
exe 文件不包含任何 32 位或 64 位代码,它只包含 IL 代码。
JIT 编译器从 IL 代码创建机器代码,平台目标决定了允许 JIT 编译器创建哪种机器代码。
我认为你误解了 CorFlags
。这是一个CorFlags
真相table:
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+
。原因是因为 header 必须向后兼容。这意味着如果程序集要在 'Any CPU'、32 位和 64 位中工作,那么 header 格式必须是 32 位操作系统可识别的格式。 PE32+
仅适用于 64 位 header 格式,如果将 header 应用于编译为 Any CPU
的程序集,则 32 位操作系统将无法识别 PE32+
header格式.
不确定之前有人问过这个问题(我找不到)。 我有简单的控制台 app/ESE 并具有以下设置。
我是 运行 Windows 8、63 位 OS。和 EXE 目标框架 .NET 4.5 但是,当我编译这个EXE时,它仍然显示为32位EXE。
因为这是 "Any CPU",我希望 EXE 编译为 64 位/PE32+。
有人能帮忙说说为什么这仍然是 32 位吗?
exe 文件不包含任何 32 位或 64 位代码,它只包含 IL 代码。
JIT 编译器从 IL 代码创建机器代码,平台目标决定了允许 JIT 编译器创建哪种机器代码。
我认为你误解了 CorFlags
。这是一个CorFlags
真相table:
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+
。原因是因为 header 必须向后兼容。这意味着如果程序集要在 'Any CPU'、32 位和 64 位中工作,那么 header 格式必须是 32 位操作系统可识别的格式。 PE32+
仅适用于 64 位 header 格式,如果将 header 应用于编译为 Any CPU
的程序集,则 32 位操作系统将无法识别 PE32+
header格式.