2008-10-29 49 views
5

道歉,如果我所说的任何内容都没有意义或忽视某些显而易见的事情 - 我对CLR内部知识的了解是多余的。x64 .NET编译/进程资源管理器奇怪

如果我理解正确,那么如果我只是在VS2K5中为'AnyCPU'创建一个解决方案(或者使用这些设置指向带有.sln文件的MSBuild),那么二进制文件只能编译到MSIL。如果在32位平台或64位代码上执行,那么他们会在32位上执行JIT操作(如果在64位上执行的话)

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

但是,当我使用进程资源管理器来检查DLL视图中的这些DLL之一的属性,它说:'图像:32位'。是什么赋予了?

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

回答

5

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

设置“任何Cpu”的目的是强制原生图像和程序集中最常见的分母,以便它让Windows的Windows启动程序选择哪种运行时将是最合适的目前的平台。

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

2

然后,如果在32位平台或64位代码上执行操作(如果在x64上执行的话),它们将被打到32位......对吧?

正确的,你可以通过执行编译AnyCPU相同的exe检查:

的sizeof(IntPtr的)== 4 //真正的在32位

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

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

+0

谢谢:) 任何想法为什么Process Explorer是恶作剧? – 2008-10-29 17:10:39