CLR的执行模型(学习总结)

2021-09-06  本文已影响0人  BUTIMHERE

一、 将源代码编译成托管模块

任何面向CLR的语言,无论选择什么Microsoft编译器,在被编译以后,都会变成托管模块。但在所有的Microsoft编译器中,Microsoft C++编译器例外,是独一无二的,因为它允许开发人员同时写托管代码和非托管代码。

1,什么是托管模块(Managed Module)?
托管模块是标准的32位Microsoft Windows 可移植执行体(PE32)文件,或者是标准的64位Microsoft Windows 可移植执行体(PE32+)文件,它们都需要CLR才能执行。
托管模块由4部分组成,分别是 PE32或PE32+、CLR头、元数据、IL(Intermediata Language)(中间语言)代码。

PE32 或 PE32+ 头

标准Windows PE文件头,类似于“公共对象文件格式”(Common Object File Format, COFF)头。如果这个头使用PE32格式,文件能在Windows的32位或64位版本上运行;如果这个头使用PE32+格式,文件只能在 Windows的64位版本上运行。这个头还标识了文件类型,包括GUI、CUI、DLL,并包含一个时间标记来指出文件的生成时间。对于只包含IL代码的模块,PE32(+)头的大多数信息会被忽视。如果是包含本机CPU代码的模块,这个头包含与本机CPU代码有关的信息。

CLR 头

包含使这个模块称为托管模块的信息(可由CLR和一些实用程序进行解释)。头中包含要求的CLR版本,一些标志,托管模块入口方法(Main 方法)的MethodDef 元数据 token 以及模块的元数据、资源、强名称、一些标志及其他不太重要的数据项的位置/大小。

元数据

每个托管模块都包含数据表。主要有两种表,一种用来描述源代码中定义的类型和成员,另一种用来描述源代码中引用的类型和成员。

IL(中间语言)代码

编译器编译源代码时生成的代码。在运行时,CLR将IL编译成本机CPU指令

元数据总是嵌入和代码相同的exe/dll文件中,元数据和IL代码是密不可分的,因为编译器在编译时会同时生成元数据和IL代码,并将他们绑定在一起,再嵌入到最终生成的托管模块中,所以元数据和它描述的IL代码永远不会失去同步。

上一篇下一篇

猜你喜欢

热点阅读