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


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

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

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

结构二:

上述内容均来自《CLR》,如理解有误,还请指出
程序集的内部结构(托管模块、元素局、IL代码的分布情况)的更多相关文章
- C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
本篇主要体验:编写C#,IL代码,用"VS2012开发人员命令提示"编译成程序集,并运行程序. □ C#文件编译为程序集 →在F盘创建as文件夹→在as文件夹下创建MyClass. ...
- 【C#基础概念】程序集与托管模块的概念
本文是为了学习程序集而整理的网上资料,主要包括两个部分,概念和使用,前部分讲怎样理解程序集,后部分讲述怎样使用的细节. 程序集与托管模块的概念 "程序集与托管代码块"(摘自Hima ...
- C#程序集系列02,使用记事本查看可执行程序集的IL代码
继续上一篇"C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序",在F盘的as文件夹中已经有了若干程序集.本篇体验使用记事本查看可执行程序集的IL代码 ...
- 四、CLR执行程序集中代码和IL代码简介
三.加载公共语言运行时中介绍了在安装了.Net Framework中加载公共语言运行时,公共语言运行时加载程序集的过程.以及通过vs stdio设置源码编译的目标平台的过程. 本问主要介绍公共语言加载 ...
- 【C#进阶系列】02 PE文件,程序集,托管模块,元数据——还是那个Hello world
好了,还是这张图,还是一样的Hello world. 因为本章其实很多都是讲一些命令行编译啊什么鬼的配置类的东西,要用的时候直接百度或者回头查书就可以了, 所以了解一下也就行了,也没有记录下来,接下来 ...
- [CLR via C#]1.2 将托管模块合并成程序集
原文:[CLR via C#]1.2 将托管模块合并成程序集 1.CLR是不和托管模块一起工作的,CLR是和程序集一起工作的. 2. 程序集是一个或多个托管模块/资源文件的逻辑性分组. 3. 程序 ...
- 一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)
本文脉络图如下: 1.CLR(Common Language Runtime)公共语言运行时简介 (1).公共语言运行时是一种可由多种编程语言一起使用的"运行时". (2).CLR ...
- .Net Framework 之 托管模块与程序集的关系
一.基本概念: --托管模块:一个标准的32的可移植执行体(PE32)文件或一个标准的64位可移植执行体(PE32+)文件.由用支持CLR的任何一种语言创建的源代码文件,再经过相应的编译器检查语法和分 ...
- 【CLR via C#】CSC将源代码编译成托管模块
下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...
随机推荐
- CSS技巧!像table一样布局div
摘自:http://www.cnblogs.com/hnyei/archive/2011/09/19/2181442.html 许多网页设计师都喜欢,将两个或者多个容器等高的并排放置,并在里面展示每个 ...
- VM VirtualBox安装Centos6.5
· · 参考资料:http://www.jb51.net/os/239738.html 如果安装图形界面,内存分配要大于628M 和下图安装选项无关,1.2都可以 界面说明: Install or u ...
- 条码知识之九:EAN-128条码(上)
EAN-128码,现称GS1-128码,是专用于GS1系统中的条码,可以标注商品的附加信息,在商品信息的标识.产品的跟踪与追溯中有广泛的用途. EAN-128码来自于CODE-128码,在字符集.条 ...
- Outlook Anywhere 每次要输入密码
客户端加入域Exchange OutlookAnywhere使用NTLM验证 2007 2010:
- Windows Phone 8初学者开发—第4部分:XAML简介
原文 Windows Phone 8初学者开发—第4部分:XAML简介 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Developme ...
- maven安装jar到本地仓库
class12.jar这个东西在中央仓库里没有,所以,cmd到oracle\product\10.2.0\db_1\jdbc\lib路径下,mvn install 就好了(发布第三方jar到本地库) ...
- How many integers can you find(容斥+dfs容斥)
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- UVA 10652 Board Wrapping(凸包)
The small sawmill in Mission, British Columbia, hasdeveloped a brand new way of packaging boards for ...
- 解惑:NFC手机怎样轻松读取银行卡信息?
自支付宝钱包8.0推出了NFC新功能,仅仅要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内剩余金额.卡的信息,还能够给卡进行充值,很贴心有用. 可是非常多网友表示担忧,要 ...
- TCP/IP之DNS域名解析系统
DNS系统是一个分布式的数据库,当一个数据库发现自己并没有某查询所需要的数据的时候,它将把查询转发出去,而转发的目的地通常是根服务器,根服 务器从上至下层层转发查询,直到找到目标为止.DNS还有一个特 ...