【C#进阶系列】02 PE文件,程序集,托管模块,元数据——还是那个Hello world

摘要:
嗯,这张照片仍然是那个地狱世界。关于PE文件、程序集、托管模块和元数据,我们说托管PE文件包括四个部分:PE头、CLR头、元数据和IL代码。PE头是Windows所需的标准信息,CLR头对于托管模块是唯一的,包括CLR版本号、模块输入方法、数字签名以及模块内部元数据表的大小和偏移量。元数据是由几个表组成的二进制块。元数据表有三种类型:定义表、引用表和列表表。

好了,还是这张图,还是一样的Hello world。

【C#进阶系列】02 PE文件,程序集,托管模块,元数据——还是那个Hello world第1张

因为本章其实很多都是讲一些命令行编译啊什么鬼的配置类的东西,要用的时候直接百度或者回头查书就可以了,

所以了解一下也就行了,也没有记录下来,接下来讲得只是我认为很有用的东西。

关于引用

请看上图,MyTest程序集下面有个引用,引用里面大家都知道有很多dll,而我们的源代码中只有那5个using引用某dll里的具体的命名空间。

(引用这些dll只会对编译器造成一点影响,并不会影响最终生成的文件,更不会去影响最终的性能)

也就是说,无论你引用多少个dll,你的源代码中只使用那5个using,那么最终引用的实际上只有包含这5个using的那些dll文件。

再说PE文件,程序集,托管模块,元数据

之前我们说了托管PE文件(也就是那些exe,dll)包括4个部分:PE头、CLR头、元数据和IL代码。

其中PE头是windows要求的标准信息,CLR头是托管模块特有的,包括CLR版本号,模块的入口方法,数字签名,模块内部元数据表的大小和偏移。

元数据是由几个表构成的二进制块,有三种元数据表:定义表,引用表和清单表。

所谓定义表,主要就是对本模块内部的一些属性,方法什么的一个描述。

所谓引用表,主要就是对引用的程序集内部的一些属性,方法什么的一个描述。

所谓清单表,主要就是对程序集组成的那部分文件的信息。

程序集是进行重用、版本控制和应用安全性设置的基本单元。允许有将类型和资源文件划分到单独的文件中。(程序需要加载的程序集数量越少,性能越好,因为这样有助于减小工作集,缓解进程空间地址碎片化

CLR操作的就是程序集,先加载包含清单元数据表的文件,再根据清单来获取程序集中其它文件的名称。

好吧,我们主要还是来讲上述四者的关系

结合上图的Hello world程序,来看看我自己的理解:

源代码都会生成托管PE文件,也叫托管模块,就是那些dll和exe,而一个托管模块包含:PE头、CLR头、元数据定义表、元数据引用表和IL代码。

而这些托管模块和一些图片啊什么的资源文件,再加上一个元数据清单表就组合成了程序集(程序集是一个逻辑上的概念)。

一个PE文件也可以仅仅只是一个托管模块,也可以是一个程序集,而区分一个PE文件是托管模块还是程序集的关键就是看它有没有元数据清单表。

那么最通俗的讲,a.EXE引用了b.dll,那么a.exe就是一个程序集,但是b.dll引用了c.dll那么b.dll其实也是一个程序集。

同时a,b,c都是托管PE文件,都是托管模块。

可能饶了点,上述理解中如有纰漏还望看到的大神指出,以免本人在错误的道路上越走越远。

免责声明:文章转载自《【C#进阶系列】02 PE文件,程序集,托管模块,元数据——还是那个Hello world》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NVIDIA Jetson AGX Xavier 开机、刷机、换源(亲测有效)以及bug列举及其解决方案【转】Java代码格式化规范实践总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JDK8 元空间

1. 运行时常量池和静态变量都存储到了堆中,MetaSpace存储类的元数据,MetaSpace直接申请在本地内存中(Native memory),这样类的元数据分配只受本地内存大小的限制,OOM问题就不存在了。除此之外,还有其他很多好处: 2. 其实,移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java H...

如何利用C#代码获取SQLite数据库的元数据

Sqlite数据库,在很多场合已经用得比较多,由于我的代码生成工具的需要,需要把Sqlite的表、字段、视图等信息获取出来,以便实现各种数据库快速生成项目工程的操作。这里就需要利用C#获取Sqlite数据库的元数据了,和其他数据库一样。 为了获取Sqlite的数据库对象数据,我做了一个测试的例子来获取他的相关信息,其实它的元数据还是和Access的操作方式...

海量小文件存储与Ceph实践

  海量小文件存储(简称LOSF,lots of small files)出现后,就一直是业界的难题,众多博文(如[1])对此问题进行了阐述与分析,许多互联网公司也针对自己的具体场景研发了自己的存储方案(如taobao开源的TFS,facebook自主研发的Haystack),还有一些公司在现有开源项目(如hbase,fastdfs,mfs等)基础上做针对...

Hive 基础

Facebook为了解决海量日志数据的分析而开发了hive,后来开源给了Apache基金会组织。 hive是一种用SQL语句来协助读写、管理存储在HDFS上的大数据集的数据仓库软件。 Hive 特点 1 是基于 Hadoop 的一个数据仓库工具;2 Hive 最大的特点是将 Hive SQL语句转换为 MapReduce、Tez 或者 spark 等任务执...

.NET中反射机制的使用与分析

.NET反射的定义:审查元数据并收集关于它的类型信息的能力。 元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述。将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中。 而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中。在模块或程序集中定义和...

Hadoop的管理目录

HDFS文件结构 1、NameNode的文件结构,NameNode会创建VERSION、edits、fsimage、fstime文件目录。其中dfs.name.dir属性是一个目录列表,是每个目录的镜像文件。VERSION文件是JAVA属性文件,其中包含运行HDFS的版本信息。包含内容:   其中,namespaceID是文件系统的唯一标识符,当文件系统...