【问题标题】:x64 .NET compilation / Process Explorer oddityx64 .NET 编译/进程资源管理器怪异
【发布时间】:2008-10-29 14:52:09
【问题描述】:

如果我要说的任何内容没有意义或忽略了一些明显的事情,我深表歉意 - 我对 CLR 内部的了解参差不齐。

如果我理解正确,那么如果我只是在 VS2K5 中为“AnyCPU”构建一个解决方案(或使用这些设置将 MSBuild 指向那个 .sln 文件),那么二进制文件只能编译到 MSIL。然后,如果在 32 位平台上执行,它们会被 JITted 到 32 位;如果在 x64 上执行,它们会被 JITted 到 64 位代码......对吗?

DLL 用于 Web 应用程序并托管在 W3WP.exe 进程中。 Process Explorer 告诉我 W3WP 是一个 64 位进程。

但是,当我使用 Process Explorer 在 DLL 视图中检查其中一个 DLL 的属性时,它会显示:“图像:32 位”。什么给了?

如果我对有问题的 dll 运行 corflags,它会告诉我: ILONLY 1 , 32BIT 0 but PE PE32 。我的理解是,这意味着是的,它只编译到 IL,不,它不限于 32 位或 64 位,但我并不完全清楚。 PE32 标志是否与上述显示为 32 位有关?

【问题讨论】:

    标签: .net clr 64-bit process-explorer corflags


    【解决方案1】:

    您的问题与this question 有关。您在进程资源管理器中看到的是图像类型,它与程序集的corflags 中指定的“运行时兼容性”类型不同。

    设置“Any Cpu”的目的是在本机映像和程序集中强制使用最常见的分母,以便让 .NET 的 Windows 引导程序选择哪种运行时最适合当前平台。

    因此,对于您的示例,您确实有一个 32 位图像(由 PE 标头指定),其中包含一个“任何 CPU”程序集(由程序集的 CorFlags 指定)。

    【讨论】:

      【解决方案2】:

      如果在 32 位平台上执行,它们会被 JITted 到 32 位;如果在 x64 上执行,它们会被 JITted 到 64 位代码......对吗?

      对,你可以通过执行为 AnyCPU 编译的相同 exe 来检查:

      sizeof(IntPtr) == 4 //true on 32bit

      sizeof(IntPtr) == 8 //true on 64bit

      但是,如果您的程序集在仅为 32 位平台编译的进程中被引用,它将被 jited 为 32 位(在 64 位 Windows 的 WOW 中运行)。

      【讨论】:

      • 谢谢 :) 知道为什么 Process Explorer 会调皮吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      相关资源
      最近更新 更多