程序集的内部结构

在看程序集的结构之前,我们先来看托管模块的结构。

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

通过模块的入口我们可以找到所有的类型,通过类型的入口我们可以找到她的所有的成员的入口,就能找到所有的成员,成员方法的入口会有指向IL代码的索引,所以我们只要有模块的入口就可以拿到入口中的说有元素了。另外我们还可以看出处理方法和属性成员以外其他的元素都是用元数据描述出来的,只有这两者是有IL代码的描述的。

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

Manifest包含的表有:

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

机构一:

结构二:

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

最新文章

  1. python file
  2. 关于MariaDB5.5不是有效的Win32 应用程序
  3. 1455.Solitaire(bfs状态混摇)
  4. HTML DOM学习之二
  5. 桥牌笔记L4D17:小心阻塞
  6. JAVA基础知识之JVM-——自定义类加载器
  7. Android(java)学习笔记112:局部位置的内部类的介绍
  8. Android 自定义View修炼-Android中常见的热门标签的流式布局的实现
  9. BFM1
  10. Const和ReadOnly
  11. 非常基本的SQL 内外连接
  12. 查询sql server进程死锁方案
  13. 1.WF 4.5在项目中直接使用的问题
  14. AtCoder Grand Contest 021 D - Reversed LCS
  15. ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
  16. 【笔记】Python基础七:正则表达式re模块
  17. webpack对于引入的模块无法智能代码提示
  18. ios中 pickerView的用法
  19. 推荐一款编辑SQL的工具:jsqlparser
  20. php学习二:表达式

热门文章

  1. 《JavaScript权威指南》拾遗(上)
  2. Week14(12月11日):路由
  3. Android外部存储 - 官方文档解读
  4. spring mvc 分页
  5. 笔试题&面试题:找出一个数组中第m小的值并输出
  6. git 解决冲突的办法
  7. UVA 1619 Feel Good(DP)
  8. stm32之Systick(系统时钟)
  9. python学习(一)
  10. {key}面向对象程序设计-C++ polymorphism 【第十三次上课笔记】