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

时间:2022-09-18 00:01:41

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

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

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

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

关于引用

请看上图,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的更多相关文章

  1. JavaScript进阶系列02,函数作为参数以及在数组中的应用

    有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...

  2. 破解软件系列-PE文件深入浅出之Section Table节表

    我们已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到 section table(节表)了.节表其实就是紧挨着 PE header 的一结构数组.该数组成员的数目 ...

  3. 一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)

    本文脉络图如下: 1.CLR(Common Language Runtime)公共语言运行时简介 (1).公共语言运行时是一种可由多种编程语言一起使用的"运行时". (2).CLR ...

  4. C#进阶系列 ---- 《CLR via C#》

      [C#进阶系列]30 学习总结 [C#进阶系列]29 混合线程同步构造 [C#进阶系列]28 基元线程同步构造 [C#进阶系列]27 I/O限制的异步操作 [C#进阶系列]26 计算限制的异步操作 ...

  5. JavaScript进阶系列06,事件委托

    在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...

  6. JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

    本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...

  7. PE文件详解(三)

    本文转自小甲鱼的PE文件详解系列传送门 PE文件到内存的映射 在执行一个PE文件的时候,windows 并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制. 也就是说,windows ...

  8. JavaScript进阶系列07,鼠标事件

    鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...

  9. JavaScript进阶系列04,函数参数个数不确定情况下的解决方案

    本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...

随机推荐

  1. ASP.NET Web API默认支持的媒体类型(SupportedMediaTypes)

    JsonMediaTypeFormatter XmlMediaTypeFormatter ( application/xml  text/xml) FormUrlEncodedMediaTypeFor ...

  2. 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html   实例: ...

  3. Android手机部分名词浅谈

    1.什么是Radio? Radio是无线通信模块的驱动程序,ROM是系统程序,radio负责网络通信,ROM和Radio可以分开刷,互不影响.如果您的手机刷新了ROM后有通讯方面的问题可以刷新radi ...

  4. (转)fastdfs_v4.07 / 实现多服务器

    http://my.oschina.net/shking/blog/165326 自己闲着没事,在小黑上虚拟了 4 个 centos 64 的系统,用来安装分布式 fastdfs . nginx 负载 ...

  5. setPixel抛出java.lang.IllegalStateException

    原来,从ImageView里读取的Bitmap,或者加载drawable里的图片资源,返回的都是一个immutalbe的bitmap,所以不能用setpixels 必须采取类似Bitmap bmp = ...

  6. hdu1561 The more, The Better 树形DP+分组背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 思路: 典型的树形背包题目: 定义dp[i][j]表示以i为根节点,攻打j个城堡的获得的财宝的最 ...

  7. jsp中的request.setAttribute的使用

    1.第一个jsp页面 <form id="form1" method="post" action="first.jsp"> &l ...

  8. Java 猜字谜游戏

    package fundmental_excise6; import java.util.Arrays; import java.util.Scanner; /** * @author : jeasi ...

  9. 【LGR-054】洛谷10月月赛II

    [LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...

  10. 7、包装类、System、Math、Arrays、大数据运算

    基本类型封装 基本数据类型对象包装类概述 *A:基本数据类型对象包装类概述 *a.基本类型包装类的产生 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字 ...