x64 .NET编译 / 进程探测器异常

5

如果我说的话有些不清楚或者忽略了一些显而易见的事情,我很抱歉——我对CLR内部的知识了解不够全面。

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

DLL用于Web应用程序,并托管在W3WP.exe进程中。进程资源管理器告诉我W3WP是一个64位进程。

但是当我使用进程资源管理器在DLL视图中检查其中一个DLL的属性时,它显示:“Image: 32-bit”。这是怎么回事?

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

2个回答

5
您的问题与这个问题有关。您在进程资源管理器中看到的是图像类型,它与程序集的corflags指定的“运行时兼容性”类型不同。
设置“任意CPU”的目的是强制本机图像和程序集的最常见分母,以便让.NET的Windows引导程序选择当前平台最合适的运行时。
因此,对于您的示例,您确实拥有一个32位图像(由PE头指定),其中包含一个“任意CPU”程序集(由程序集的CorFlags指定)。

2
他们在32位平台上执行时会被JIT成32位代码,而在x64上执行时则为64位代码...对吗?
是的,你可以通过执行编译为AnyCPU的相同exe来进行检查:
sizeof(IntPtr) == 4 //在32位上为true sizeof(IntPtr) == 8 //在64位上为true 但是,如果您的程序集被引用到仅编译为32位平台的进程中,则它将被JIT为32位代码(在64位Windows上运行WOW)。

有什么想法为什么进程资源管理器会调皮捣蛋? - alexis.kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接