程序集的内部结构(托管模块、元素局、IL代码的分布状况)

程序集的内部结构spa

        

       在看程序集的结构以前,咱们先来看托管模块的结构。3d

       托管模块由四部分组成:PE32头、CLR头、元数据(Metadata)、IL代码。其中PE32头是用来决定托管模块运行的系统环境(32位、64位)的,CLR头饰用来描述CLR版本等信息的,这二者不是咱们的重点,咱们主要来讨论元数据,和IL代码。元数据实际上是一些用来描述程序集、托管模块、类型、类型的成员之间的关系的表(tables),咱们能够将这些表分为三类 定义表、引用表、Manifest,咱们一般所受的托管模块是不包含Manifest的。下面是托管模块的示意图:blog

 

 

  

 

 

        经过模块的入口咱们能够找到全部的类型,经过类型的入口咱们能够找到她的全部的成员的入口,就能找到全部的成员,成员方法的入口会有指向IL代码的索引,因此咱们只要有模块的入口就能够拿到入口中的说有元素了。另外咱们还能够看出处理方法和属性成员之外其余的元素都是用元数据描述出来的,只有这二者是有IL代码的描述的。索引

 

 

 

如今应该把Module的结构明确了,接下来就是程序集了,程序集是由托管模块编译获得的,程序集有多种形态,有单文件程序集、多文件程序集,单文件程序集只包含一个物理文件,多文件程序集包含多个物理文件。咱们平时用VS建立的项目都是被编译成一个单文件程序集(VS不支持多文件程序集的建立),它只包含一个托管模块,这个托管模块就是咱们的程序集,与通常的托管模块不一样的是,它会包含Manifest类型的一些表,咱们就是利用这些表来描述程序集中托管模块的分布,从而将托管模块从逻辑上来关联成为一个程序集的。编译

 

Manifest包含的表有:table

Manifest 中还包含一些引用表,是用来描述程序集中全部模块引用的程序集的入口的,这样在咱们加载程序集的时候,就能够根据这个表知道有哪些程序集被引用了,下面是多文件程序集的两种可能的结构:引用

 

机构一:程序

结构二:方法

 

上述内容均来自《CLR》,如理解有误,还请指出im

相关文章
相关标签/搜索