windows程序生成目标平台与CLR运行执行过程

时间:2022-09-10 00:56:06

C# 编译器提供一个选项, 该选项允许指定最终生成的程序集只能运行在32位windows版本的X86机器上使用, 只能在运行64位windows的X64机器上使用, 或者只能在32为windows RT的ARM机器上使用。

PS: 不指定具体平台的话, 默认选项就是anycpu, 该选项指定程序集能在任何版本的windows上运行。

 windows程序生成目标平台与CLR运行执行过程

 

由于生成版本选项, C#编译器生成的程序既包含的要么是PE32头, 要么是PE32+头。

windows程序生成目标平台与CLR运行执行过程

 

除此之外, 编译器还会在头中指定CPU架构(默认是anycpu 代表任意CPU架构)。

Microsoft发布的SDK命令行实用程序 DumpBin.exe 和CorFlags.exe, 可用它们检查编译器生成的托管模块所嵌入的信息。


Windows应用程序运行过程?

1.可执行文件运行时, Windows检查文件头, 判断需要是32位还是64位的地址空间。
PE32文件在32位或者64位地址空间均可运行,
PE32+文件则需要64位地址空间
PS: windows还会检查头中嵌入的CPU架构信息, 确保当前计算机的CPU符合要求。

2.Windows检查EXE文件头, 决定是创建32位还是64位进程之后, 会在进程地址空间加载MSCorEE.dll的x86,x64或ARM版本

如果是Windows的X86或ARM版本, MSCorEE.dll的X86版本在 %SystemRoot%\System32目录中。
如果是Windws的X64版本,MSCorEE.dll的X86版本在 %SystemRoot%\SysWow64 目录中。
64位版本则在 %SystemRoot%\System32目录中(为了向后兼容).

3.

然后进程的主线程调用MSCorEE.dll中定义的一个方法, 这个方法初始化CLR, 加载exe程序集,

再调用其入口方法(Main), 随即, 托管应用程序启动并且运行。

 

注: Environment的 Is64BitOperatingSystem 属性, 可判断是否在64位windows运行, Is64BitProcess属性可判断是否在64位地址空间运行。