如果程序集文件只包含类型安全的托管代码,那么无论在32位版本的windows上,还是64位版本上的windows上,所写的代码都应该能正常工作。在这两种版本上的windowss上运行,源代码无需进行任何改动。事实上,编译器最终生成的EXE/ELL文件不仅能在32位windows上运行,还能在64位windows的X64和IA64版本上运行。也就是说,只要机器上安装了.NET Framework的某个版本,文件就能在这台机器上运行。
取决于/platform开关选项,C#编译器生成的程序集要么包含一个PE32头,要么包含一个PE32+头,除此之外,编译器还会在头中指定要求什么CPU架构(如果使用默认值anycpu,则不明确指定)。Microsoft发布了SDK命令实用程序DumpBin.exe和CorFlags.exe,可用他们检查编译器生成的托管模块所嵌入的信息。
运行一个可执行文件时,Windows会检查这个EXE文件的头,判断应用程序需要的是32位地址空间,还是64位地址空间,具有PE32头的文件可在一个32位或64位地址空间中运行,具有PE32+头的文件则需要一个64位地址空间。Windows还会检查头中嵌入的CPU架构信息,确保当前计算机的CPU是否符合要求的,最后,Windows的64位版本提供了一个名为WoW64(Windows on Windows64)的技术,允许运行32位Windows应用程序。该技术甚至允许使用X86本地代码的32位应用程序在Itanium机器上运行。
WINDOWS 检查好EXE文件头,决定是创建32位、64位还是WoW64进程之后,会在进程地址空间中加载MSCorEE.dll的X86,X64或IA64版本。如果是Windows的X86版本,MSCorEE.dll的X86版本会在C:\Windows\System32目录中。如果是Windows的X64或IA64版本,MSCorEE.dll的X86版本再C:\Windows\SysWow64目录中,64位版本(X64或者IA64)则在C:\Windows\System32目录中(为了向后兼容),然后,进程的主线程调用MSCorEE.dll中定义的一个方法。这个方法初始化CLR,加载EXE程序集,然后调用其入口方法(Main),随机,托管的应用程序将启动并运行。