做了一段时间开发,最近重新看了一下C#底层的知识,记录一下。
说明:全文不区分大小写,以后不加额外注释的都遵循这个规则。
1 CLR的执行模型
1.1 将源代码编译成托管模块
公共语言运行时(common language runtime,clr)是多语言平台的运行时,核心功能:内存管理、程序集加载、安全性、异常处理和线程同步等。
将源代码编译成托管模块:C#源代码文件→C#编译器→托管模块(中间语言和元素据)。
托管模块:
(1)PE32/PE32+。PE32可以在32或者64位系统运行,PE32+只能在64位系统运行,还标志文件类型(GUI,CUI,DLL),包含生成时间。
(2)CLR头。主要是CLR版本、flag、main方法的元素据token、模块元素据、资源等。
(3)元素据。
(4)IL代码。将IL编译成本机CPU指令。
1.2 将托管模块合并成程序集
Clr与程序集(是一个或多个模块/资源文件的逻辑分组,是重用、安全性、版本控制的最小单元)工作,而不是模块。
托管模块(IL、元素据)+资源文件(.JPG…)→将多个托管模块和资源文件合并成程序集的工具(C#编译器)→程序集
1.3 加载公共语言运行时
程序集可以是可行性应用程序,也可以是dll,他们都由clr来管理(.net framework框架下,Windows 7及以后系统都自动安装了)。