C#基础系列-程序集(Assembly)
一、前言
学习反射的原理,探究元数据,了解到程序集的内容,我们在vs中创建解决方案,解决方案中创建项目或者类库、在项目中创建类(类的成员变量);通过VS编译器将代码编译成exe文件或者编译成dll文件,那这个文件是如何构成的,系统是如何加载到内存运行程序的等问题
二、内容
一个应用程序运行起来会创建一个应用程序域(AppDomain)、一个程序域包含所有程序集(assembly)、通过加载assembly到内存,assembly包含类信息,通过Type对象和元数据将类的成员信息加载到内存中。C#高级语言创建的程序代码如何在计算机中运行,从编译器中编辑、编译器中编译、JVM中运行(运行时环境)、计算机中机器语言(01)运行,整个过程如下图所示:
PE部分 | PE部分的内容 |
PE 标头 |
PE 文件主要部分的索引和入口点的地址。 运行库使用该信息确定该文件为 PE 文件并确定当将程序加载到内存时执行从何处开始。 |
MSIL 指令 | 组成代码的 Microsoft 中间语言指令 (MSIL)。许多 MSIL 指令带有元数据标记。 |
元数据 | 元数据表和堆。运行库使用该部分记录您的代码中每个类型和成员的信息。本部分还包括自定义属性和安全性信息。 |
程序集结构 | 描述 |
程序集的元数据 | 程序集元数据也叫清单,它记录了程序集的许多重要信息,是程序集进行自我说明的核心文档。当程序运行时,CLR 通过这份清单就能获取运行程序集所必需的全部信息。清单中主要主要包含如下信息:标识信息(包括程序集的名称、版本、文化和公钥等);文件列表(程序集由哪些文件组成);引用程序集列表(该程序集所引用的其他程序集);一组许可请求(运行这个程序集需要的许可) |
类型元数据 | 类型元数据列举了程序集中包含的类型信息,详细说明了程序集中定义了哪些类,每个类包含哪些属性和方法,每个方法有哪些参数和返回值类型,等等 |
MSIL代码 | 程序集元数据和类型元数据只是一些辅助性的说明信息,它们都是为描述MSIL代码而存在的。MSIL 代码是程序集的真正核心部分,正是它们实现了程序集的功能;通过编译器将代码编译成中间语言IL,在各操作系统平台通过.NET平台运行时(CLR/JIT)等将IL生成机器码执行。 |
资源文件 | 程序集中还可能包含图像、图标、声音等资源 |
程序集类型 | 描述 |
私有程序集 | 私有程序集是对于应用程序单独所有,通过vs生成的文件,复制到程序文件夹既可以运行 |
共享程序集 | 共享程序集是被不同应用成所调用,使用比如.NET类库的程序集,必须考虑命名冲突和版本冲突等问题。解决这些问题的办法是把共享程序集放在系统的一个特定文件夹内,这个特定文件夹称为全局程序集高速缓存(GAC)。这个过程可用专门的.NET 工具完成。 |
三、总结
通过上述内容,深入理解程序集的构成情况,了解计算机内存是如何加载程序代码文件,然后cpu读取指令和数据信息。而平时编写代码的时候考虑多的是业务逻辑怎么编写,很少会考虑这个代码文件编译之后生成的文件是什么。了解这些底层的信息一样帮助我们理解编程。