好了,还是这张图,还是一样的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文件,都是托管模块。
可能饶了点,上述理解中如有纰漏还望看到的大神指出,以免本人在错误的道路上越走越远。
出处:https://www.cnblogs.com/vvjiang/
本博客文章均为作者原创,转载请注明作者和原文链接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构