我们使用任何支持CLR的编程语言创建源代码文件,经过编译器编译之后,生成的结果都是托管模块(Manage Module)。
托管模块是需要CLR才能执行的标准windows可移植可执行(PE)文件。
下面主要描述托管模块的各个组成部分:
部分 | 描述 |
PE表头 | 该表头指出了该文件的类型:GUI、CUI、Web Service、Exe、Dll等。 另外该表头还包括一个时间标记用于表示文件创建的时间。 |
CLR表头 | 包含标识托管模块的一些信息。这些信息包括托管模块所需要的CLR版本号、托管模块入口点方法(Main方法)的MethodDef元数据标识,以及有关托管模块的元数据、资源、强命名、标记等。 |
IL代码 | 编译器在编译源代码时产生的指令。 CLR在运行时会将IL代码编译成本地cpu指令。 |
元数据 | 元数据总是和IL代码在一起的。 元数据主要有两类: 一类是用于描述源代码中定义的类型和成员; 一类是用来描述源代码中引用的类型和成员。 |
元数据的作用:
- 有了元数据后,写代码时就不需要像c语言一样自己去引入头文件和库文件等。因为在元数据中已经对引用到的类型和成员做了记录,编译器直接从元数据中就能够获得相关引用信息。
- 有了元数据,代码编辑器就可以实现智能感知。
- CLR的代码验证过程可以利用元数据来确保代码仅执行“安全”的操作。因为通过元数据就知道了某个操作需要多少的空间等信息。
- 利用元数据,可以将一个对象的字段序列化到一个内存块中,然后远程的传送给另一台机器,最后再在远程机器上执行反序列化,从而重新创建对象和它的状态。
- 利用元数据,垃圾收集器可以追踪对象的生命周期。对于任何对象,垃圾收集器都能够通过元数据来确定该对象的类型,并且可以获知该对象的哪些字段引用了其它对象。