5

如果我要说的任何内容毫无意义或忽略了一些显而易见的事情,我深表歉意——我对 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 位有关?

4

2 回答 2

5

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

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

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

于 2008-11-22T21:25:27.417 回答
2

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

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

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

sizeof(IntPtr) == 8 //在 64 位上为真

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

于 2008-10-29T15:07:05.267 回答