CLR(Common Language Runtime):一个可由多种编程语言使用的"运行时"。
CLR的核心功能(内存管理,程序集加载,安全性,异常处理,线程同步等)可由面向CLR的所有语言使用。
托管模块(managed module):标准的32位windows可移植执行体(PE32)文件,或者是标准的64位windows可移植执行体(PE32+)文件,他们都需要CLR才能执行。
面向CLR的语言编写的源代码文件通过编译器编译后就是托管模块。
托管模块的组成部分:
1.PE32或PE32+头:标准的Windows P文件头,PE32能在x86,x64上运行,PE32+只能在X64上。标识了文件类型,包括GUI,CUI或者DLL,并包含一个时间标记来指出文件的生成时间。
2.CLR头:包含使这个模块成为托管模块的信息(CLR来解释)。包含要求的CLR版本,一些flag,托管模块入口方法(Main)的MethodDef元数据token以及模块的元数据,资源,强名称,一些标志及其他不太重要的数据项的位置/大小。
3.元数据:每个托管模块都包含元数据表。主要有两种表:一种表描述源代码中定义的类型和成员,另一种描述源代码引用的类型和成员。Def & Ref.
4.IL(中间语言)代码:编译器编译源代码生成的代码。在运行时,CLR将IL编译成本机CPU指令。(目前实用的编译器是roslyn,也有编译器直接将源代码编译器编译成本地代码)。
托管代码(managed code):IL代码的一个其他的叫法。
程序集(Assembly):抽象概念, 一个或多个模块/资源文件的逻辑性分组。在CLR世界中,程序集相当于“组件”。
清单(Manifest):包含在PE32(+)头的数据块,元数据表的集合。描述了构成程序集的文件,程序集中的文件所实现的公开导出的类型(PUBLIC)以及与程序集关联的资源和数据文件。
编译器默认将生成的托管模块转换成程序集,相当于含有清单的托管模块。程序集把它的逻辑表示和物理表示区分开。
JIT(Just-in-time):CLR中的JIT编译器把IL代码装成本机(NATIVE)CPU指令,默认JIT会对不同的CPU架构进行特定的优化。