CLR_Via_C#学习笔记之CLR的执行模型

1:公共语言运行时(Common Language Runtime,CLR)是一个可由多种编程语言使用的“运行时”。CLR的核心功能(比如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用;

2:C#源代码文件---》C#编译器---》托管模块(中间语言IL和元数据);无论选用哪个编译器,结果都是一个托管模块;托管模块是一个标准的32位可移植执行体(PE32)文件,或者是一个标准的64位Windows可移植执行体(PE32+)文件,它们都需要CLR才能执行;

3:托管模块各个组成部分:(1)PE32或PE32+头;PE32文件头能在32位或64位版本上运行,PE32+文件头只能在64位版本上运行; (2)CLR头;包含使这个模块成为一个托管模块的信息(比如CLR版本,一些标志flag,托管模块入口方法Main方法的MethodDef元数据标记等);(3)元数据;每个托管模块都包含元数据表,主要有两种类型的表,一种是类型的表描述源代码中定义的类型和成员,另一种描述源代码引用的类型和成员;(4)IL中间语言代码;编译器编译源代码生成的代码,运行时CLR将IL编译成本地CPU指令;

4:CLR目前作为.NET Framework的一部份提供

5:要知道是否已安装.NET Framework,只需检查%SystemRoot%System32目录中的MSCorEE.dll文件,存在文件表明已安装;查看安装哪些版本的.NET Framework检查注册表(regedit)项的子项:KEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDP

6:IL转化成本地CPU指令:第一次:EXE/DLL--》JITCompiler--》编译成本地CPU指令--》保存到一个动态分配的内存块中  以后:直接执行内存块中的代码,完全跳过JITCompiler函数 (一个方法只有在首次调用时才会造厉一些性能损失。以后所调用都以本地代码的形式全速运行,无需重新验证IL并把它编译成本地代码,但若应用程序终止,编译好的代码也会被丢弃,JIT编译器必须再次将IL编译成本地指令);

7:程序在Debug模式下,编辑器才会生成一个Program Database(PDB)文件。PDB文件帮助调试器查找局部变量并将IL指令映射到源代码;

8:NGen.exe可以将应用程序的所有程序集(或者那个指定的程序集)的IL代码会编译成本地代码;

9:平台选择性不同:

10:修饰符范围

原文地址:https://www.cnblogs.com/wujy/p/3192027.html