学习来源:《CLR via C by Jeffrey Richter 》第四版,第1章 clr的执行模型
1.C#编译生成执行程序集文件
编译文件的组成:pe32/pe32+头,clr头,元数据,IL
pe32/pe32+头:windows标准执行文件头
clr头:clr版本,标志,入口方法,元数据,资源,强名称
编译后由CLR执行
2.CLR执行程序集
CLR的JIT编译器将方法的IL转换成本机cpu指令,
第一次调用时由jtt编译器转换成cpu指令,存储到内存中,第二次调用不用再编译,直接从内存获取
不安全代码:
jtt编译unsafe代码时,会检测程序集是否授予了System.Security.Permissions.SecurityPermission权限,
而且是否设置System.Security.Permissions.SecurityPermissionFlag的值是SkipVerification。
如果有该标志,JIT编译器不会编译不安全代码,并允许代码执行。clr信任这些代码,并希望对地址及字节的直接操作不会造成损害。
如果未设置该标志,则直接抛出异常,禁止方法执行。
3.本机代码生成器:NGen.exe
NGen.exe将IL代码编译成本机代码文件(编译好的机器码/汇编码)。由于代码已编译好,就不需要JIT再次编译IL代码了。