将源代码编译成托管代码:
编译C#源代码的过程:C#源代码-->C#编译器-->托管模块(中间语言和元数据)
托管模块的结构:
- PE32或PE32+头:标准windowsPE头文件。PE32格式,只能在windows 32位系统运行。还标示了文件类型:GUI、CUI、DLL。 文件生成时间。
- CLR头:CLR版本、托管模块入口方法main的MethodDef元数据标记,模块元数据,资源,强名称。
- 元数据:两种类型的表:一、描述源代码中定义的类型和成员。二、描述源代码引用的类型和成员。
- IL中间语言代码:编译器编译源代码时生成的代码,在运行时,CLR将IL编译成本地cpu指令。
每个面向CLR的编译器生成的都是IL中间语言代码。除了生成IL,面向CLR的每个编译器还要在每个托管模块中生成完整的元数据,metadata。元数据是一组数据表,描述了模块中定义的内容和模块中引用的内容。元数据总是嵌入和代码相同的exe或dll文件中,是两者密不可分。(同步)
将托管模块合并成程序集:
CLR和程序集一起工作。程序集是一个或多个模块/资源文件的逻辑分组,是重用、安全性以及版本控制的最小单元。
清单是有元数据表构成的另一种集合,描述了构成程序集的文件,由程序集中的文件实现的公开导出的类型(由Public标识的类型),以及与程序集关联在一起的资源或数据文件。
对于一个可重用的、可保护的、可版本控制的组件,程序集把它的逻辑表示和物理表示区分开来。