CorFlags说我的.NET程序运行为64位,而DumpBin意味着它是32位

时间:2016-08-05 13:33:16

标签: .net 32bit-64bit

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

x64vsx86

正如您所看到的,当在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作为目标平台时,操作系统将选择如何执行程序集。在64位系统上,它将以64位运行,在32位操作系统上以32位运行。

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

1 个答案:

答案 0 :(得分:0)

这完全正常。 AnyCPU意味着它可以在任何cpu上运行,因此标头中的 machine 字段不相关。必须选择某些东西,它只需选择x86。使其与Win98和Win2k等古老的Windows版本兼容。

special heroics发生在64位操作系统上,OS加载程序需要帮助从32位可执行文件创建64位进程,这需要修补内部加载器结构。 mscoree.dll“loader-shim”按照链接帖子的描述完成了这项工作。

所以你定位任何特定版本。它确实是AnyCPU。