面向CLR的编译器----(编译代码)-->(托管模块)。
托管模块(managed module)是一个需要CLR才能执行的标准的Windows可执行(protable executable)文件。它由四部分组成:PE表头,CLR表头,元数据,中间语言代码。
- PE表头:该表头文件指出了文件的类型(GUI,CUI,DLL)、时间标记用于表示文件创建的时间。对于仅包含IL代码的模块,该表头的大多数信息会被忽略。对于包含本地CPU代码的模块,该表头还会包含有关本地CPU代码的一些信息。
- CLR表头:包含标示托管模块的一些信息(可以被CLR或者一些实用工具解析),如:托管模块所需要的CLR版本号,一些标记,托管模块入口方法(Main方法)的MethodDef元数据标记,以及有关托管模块的元数据、资源、强命名标记和其他一些意义不是很大的信息的位置和尺寸。
- 元数据:每个元数据都包含有一些元数据表。元数据表只要分两种,一种用于描述源代码中定义的类型和成员,一种用于描述源代码中引用的类型和成员。
- 中间语言(IL)代码:编译器在编译源代码时产生的指令,CLR在运行时会将IL代码编译成本地CPU指令。
值得一提的是:元数据总是和包含IL代码的文件相关联。实际上,元数据总是和这些代码一起被嵌入到同一个EXE/DLL文件中,两者根本不可能分离。因为编译器总是同时产生元数据和IL代码,并且总是同时把它们嵌入到生成的托管模块中,所以元数据和它所描述的IL代码之间总能保持同步。
元数据的好处:
- 元数据省去了在源代码编译时对头文件和库文件的需求,这是因为在含有实现类型和成员的IL代码文件中,已经包含了所有被引用的类型和成员的信息。编译器可以直接从托管模块中读取元数据来获取这些信息。
- VS的智能感知(IntelliSense)特性就是通过分析元数据来附辅助我们编写代码。
- CLR的代码验证过程可以利用元数据来确保代码仅执行“安全”的操作。
- 利用元数据可以对一个对象进行序列化到内存块中,然后远程传输给另一台机器;最后在远程机器上执行反序列化,从而重新创建对象和它的状态。
- 利用元数据,垃圾收集器可以追踪对象的生存期。对于任何对象,垃圾收集器都能够通过元数据来确定该对象的类型,并且可以获知该对象的哪些字段引用了其他对象。
浙公网安备 33010602011771号