x64 .NET编译/ Process Explorer奇怪

时间:2008-10-29 14:52:09

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

道歉,如果我要说的任何内容都没有意义或忽略了一些明显的东西 - 我对CLR内部的了解很多。

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

设置“Any Cpu”的目的是强制原生图像和程序集中最常见的分母,这样它就可以让.NET的Windows引导程序选择哪种运行时最适合当前的平台。

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

答案 1 :(得分:2)

  

如果在32位平台上执行,它们会被JIT打成32位,如果在x64上执行则会得到64位代码......对吗?

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

sizeof(IntPtr)== 4 // 32位时为真

sizeof(IntPtr)== 8 // 64位时为真

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