【问题标题】:VS 2010 Project always targeting x86/32 bitVS 2010 项目始终针对 x86/32 位
【发布时间】:2011-08-07 12:23:16
【问题描述】:

我有一个项目似乎总是以 x86/32 位为目标,但我不知道为什么。我已经完成了解决方案中的所有项目,并确保 PlatformTarget 是 AnyCPU。

使用 dumpbin 检查我得到的所有二进制文件 '14C machine (x86)'。

虽然之前是 x86,但构建机器是 x64。

还有什么可能导致这种情况,我应该检查什么?

【问题讨论】:

  • 您是否正在执行任何特定于平台的 P/Invoke?什么是构建机器 - x86 或 x64?
  • 没有我知道的特定于平台的 P/Invoke。
  • 如果您在文本编辑器中查看 .csproj(或 .vbproj 文件),与在 Visual Studio 中创建的新项目相比,编译目标看起来是否合理?还是它们看起来很奇怪?
  • 有什么有趣的参考资料吗?也许其中一个 refs 是针对 x86 的......
  • 没有有趣的参考,主要是 NHibernate、DevEx Reports 和 SharpArch,以及它们的所有各种依赖项。我确实注意到所有第三方引用,例如 NHibernate 也说 '14 machine (x86)',即使我没有构建它们。

标签: .net visual-studio-2010


【解决方案1】:

您一定是在谈论使用 /headers 选项从 Dumpbin.exe 看到的输出。在平台目标设置为 AnyCPU 的 .NET 程序集上运行时看起来像这样:

Dump of file ConsoleApplication1.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               3 number of sections
        4E3E987F time date stamp Sun Aug 07 08:51:59 2011
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine
etc..

是的,IMAGE_FILE_HEADER.Machine 值设置为 0x14c,即 IMAGE_FILE_MACHINE_I386(又名 x86)的值。这无关紧要,也许最强烈的暗示它不相关的是目标名称:AnyCPU。它可以在 x86 和 x64 操作系统上运行。

你真正想要使用的是corflags.exe,它会显示文件中的COR标头:

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

32BIT标志是重要的标志,0表示使用了AnyCPU。 ILONLY = 1 表示程序集仅包含 IL,不包含机器代码。当您使用 C++/CLI 语言创建程序集时,它将为 0。

可以创建一个将机器设置为 x64 的图像文件。我认为这是在 .NET 3.0(又名 .NET 2.0 SP1)中引入的。如果将平台目标设置为 x64,则机器类型字段将设置为 IMAGE_FILE_MACHINE_AMD64(又名 x64)。这没什么区别,只是程序永远不会在 32 位操作系统上运行,并且主线程将以 4 MB 堆栈而不是 1 MB 堆栈启动。

this answer 中描述了将 32 位可执行映像转换为 64 位进程的魔法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2021-05-28
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多