C#基础系列-程序集

一、前言

  通过学习反射的原理、元数据的内容,延申了解程序集(Assembly)的内容,在vs中创建一个解决方案,解决方案中创建多个项目或者类库、在项目中创建多个类文件(类中定义各种各样的成员变量)然后通过VS编译器将代码编译成.exe文件或者.dll文件。那么问题一、这些文件的内容由什么构成的?问题二、计算机是如何加载这些文件内容到内存中运行程序?问题三、程序集是什么?

二、内容

  应用程序在计算机中运行起来会创建一个应用程序域(AppDomain)、一个程序域包含所有程序集(Assembly)、通过加载Assembly到内存,Assembly包含类(Class)信息,通过元数据(metadata)各清单将程序集、类(成员)、特性加载到内存中。

  通过一张图表示C#高级语言创建的程序代码如何在计算机中运行,从编译器中编写、编译器中编译、JVM中(运行时环境)、计算机中机器语言(01)运行,整个过程如下图所示:

    

 

可执行文件(PE)的构成
PE 标头

PE 文件主要部分的索引和入口点的地址。

运行库使用该信息确定该文件为 PE 文件并确定当将程序加载到内存时执行从何处开始。

MSIL 指令        组成代码的 Microsoft 中间语言指令 (MSIL)。许多 MSIL 指令带有元数据标记。
元数据   元数据表和堆。运行库使用该部分记录您的代码中每个类型和成员的信息。本部分还包括自定义属性和安全性信息。

 

     程序集(Assembly)的构成
程序集的元数据   程序集元数据也叫清单,它记录了程序集的许多重要信息,是程序集进行自我说明的核心文档。当程序运行时,CLR 通过这份清单就能获取运行程序集所必需的全部信息。清单中主要主要包含如下信息:标识信息(包括程序集的名称、版本、文化和公钥等);文件列表(程序集由哪些文件组成);引用程序集列表(该程序集所引用的其他程序集);一组许可请求(运行这个程序集需要的许可)
类型元数据 类型元数据列举了程序集中包含的类型信息,详细说明了程序集中定义了哪些类,每个类包含哪些属性和方法,每个方法有哪些参数和返回值类型,等等
MSIL代码 程序集元数据和类型元数据只是一些辅助性的说明信息,它们都是为描述MSIL代码而存在的。MSIL 代码是程序集的真正核心部分,正是它们实现了程序集的功能;通过编译器将代码编译成中间语言IL,在各操作系统平台通过.NET平台运行时(CLR/JIT)等将IL生成机器码执行。
资源文件 程序集中还可能包含图像、图标、声音等资源

 

       程序集(Assembly)的类型
私有程序集 私有程序集是对于应用程序单独所有,通过vs生成的文件,复制到程序文件夹既可以运行
共享程序集 共享程序集是被不同应用成所调用,使用比如.NET类库的程序集,必须考虑命名冲突和版本冲突等问题。解决这些问题的办法是把共享程序集放在系统的一个特定文件夹内,这个特定文件夹称为全局程序集高速缓存(GAC)。这个过程可用专门的.NET 工具完成。

 三、总结

  通过上述内容,深入理解程序集的构成情况,了解计算机内存是如何加载程序代码文件,然后cpu读取指令和数据信息。我们平时编写代码的时候考虑多的是业务逻辑怎么编写,很少会考虑这个代码文件在编译器中编译之后发生了什么,生成的是什么。那么了解这些底层的信息一样帮助我们更好的理解程序代码。

posted @   tuqunfu  阅读(433)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示