CorFlags 说我的 .NET 程序以 64 位运行,而 DumpBin 表示它是 32 位

CorFlags says my .NET-Program runs as 64bit while DumpBin means it is 32bit

我创建了一个项目并将其编译为Any CPU。在 x64-Windows 上。由于我无法从我的代码中引用该程序集,因此我检查了 运行time 和 target-plattform:

如您所见,当 运行在 x64-OS(如我的)上时,目标平台是 x64。我还检查了 DumpBin

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               3 number of sections
        57A49000 time date stamp Fri Aug 05 15:09:20 2016
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine

然而,当我 运行 CorFlags 它给我 x64 作为该程序集的平台时:

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32
CorFlags  : 9
ILONLY    : 1
32BIT     : 0
Signed    : 1

据我所知,当我选择 Any CPU 作为目标平台时,OS 将选择如何执行程序集。在 64 位系统上,它会 运行 在 64 位上,在 32 位上 OS 分别是 32 位。

所以我的问题是:我实际上目标是什么版本? 32 位还是 64 位?

这是完全正常的。 AnyCPU 意味着它可以在任何 cpu 上 运行,因此 header 中的 machine 字段不相关。必须选择 something,它只会选择 x86。使其与古老的 Windows 版本兼容,例如 Win98 和 Win2k。

special heroics 发生在 64 位操作系统上,OS 加载程序需要帮助从 32 位可执行文件创建 64 位进程,这需要修补内部加载程序结构。 mscoree.dll "loader-shim" 按照链接 post.

中的描述完成该工作

所以您针对任何特定版本。果然是AnyCPU