1.1 .NET 框架基本组成

.NET 框架的核心便是通用语言运行时(Commomn Language Runtime,简称 CLR),CLR 是一个可被各种不同的编程语言所使用的运行时。
托管模块(mangaed module): 一个需要 CLR 才能执行的标准 Windows 可移植可执行(porttable executable ,简称 PE)文件。

将源代码编译为托管模块:

表1-1 描述了一个托管模块的各个组成部分

托管代码:由于生存期和执行行为受 CLR 管理的缘故,IL 代码有时也称作托管代码
元数据:为托管模块产生完整的元数据。一个数据表的集合。一些用于描述托托管模块中所定义的内容(比如所定义的类型和它们的成员),另外还有一些用于描述托管模块中所引用的内容(比如被引用的类型和它们的成员)。元数据是一些早先的技术如类型库、接口定义语言(IDL)文件的一个超集(CLR 元数据包括但不仅限于列举出来的文件)。

编译器同时产生元数据和 IL 代码,并且总是同时将它们嵌入到生成的托管模块中。

元数据有很多用处,比如:

  • 元数据省去了源代码编译时对头文件和库文件的需求,这是因为在含有实现类型和成员的 IL 代码文件中,已经包含了所有被引用的类型和成员的信息。编译器可以直接从托管模块中读取元数据来获得这些信息。

  • Visual Studio .NET 可以利用元数据来辅助我们编写代码。它的智能感知(IntelliSense)特性就是通过分析元数据来告诉我们某个类型提供了哪些方法,以及某个方法有哪些参数。

  • CLR 的代码验证过程可以利用元数据来确保代码仅执行“安全”的操作

  • 利用元数据,我们可以将一个对象的字段序列化到一个内存块中,然后远程传送给另一台机器,最后再在远程机器上执行反序列化,从而重新创建对象和它的状态

  • 利用元数据,垃圾收集器可以追踪对象的生存期。对于任何对象,垃圾收集器都能够通过元数据来确定该对象的类型,并且可以获知该对象的哪些字段引用了其他对象。

微软的C++ 编译器默认生成的是非托管模块,但可以通过指定一个新的命令行开关,C++ 编译器也能够产生处需要 CLR 才能执行的托管模块。

1.2 将托管模块组合为程序集

CLR 实际上并不和托管模块打交道,它直接打交道的对象是程序集(assembly)。
程序集:一个或多个托管模块,以及一些资源文件的逻辑组合。程序集是组件复用,以及实施安全策略和版本策略的最小单位

图1-2 将托管模块组合为程序集

PE 文件(托管模块):包含了一个称作清单(manifest)的数据块。所谓清单仅仅是另外一些元数据表的集合。这些表描述了组成程序集的文件,程序集所有文件中实现的共有导出类型,以及一些和程序集相关的资源文件或数据文件。
托管模块与程序集

  • 仅包含以管模块、并且没有资源&#