前言
一直对程序集的概念模模糊糊的,打算写一篇来探究下.net程序集的方方面面,这篇文章会不断更新,直到觉得完全弄懂为止,因为还是学习中,可能会理解不对或者勘误,感谢指出!
状态
已完结
程序集是什么?
程序集是.net里的一个概念,可以看作是给一堆相关类打一个包,相当于java中的jar包。
官方的定义就是:程序集是一个或多个类型定义文件及资源文件的集合。
生成过程如下:
程序集对象包含什么?
在知道程序集对象包含什么前,我们要先知道什么是应用程序域
应用程序域是.Net引入的一个新概念,定义为:一组程序集的一个逻辑容器,进程中的一个逻辑分区。通常由运行时宿主(CLR)创建和操作,主要的作用就是用于隔离。
而程序集对象包含的东西可以看下图,可以看到其分层次,从上到下分别为模块Model -》 类型 Type -》 各种成员xxInfo
一个程序运行起来以后,可能会有一个或多个应用程序域(AppDomain),在这些应用程序域(AppDomain)中,我们可以加载我们要使用的程序集(Assembly)。我们所写的所有代码都会编译到【程序集】文件(.exe .dll)中,并在运行时以【Assembly对象】方式加载到内存中运行,每个类(Class Interface)以【Type对象】方式加载到内存,类的成员(方法,字段,属性,事件,构造器)加载到内存也有相应的对象。
如何查看当前AppDomain加载了哪些程序集?
通过AppDomain.CurrentDomain.GetAssemblies()方法,我们可以获取当前AppDomain下加载的程序集组,接着我们打印,就可以看到该AppDomain下加载了哪些程序集,如下图。
理解反射
所以反射其实就是通过获取加载到内存里的各种Assembly对象,Type对象,还有类的成员(方法,字段,属性,事件,构造器)对象信息,进而利用这些信息去创建新的对象或者修改已有的对象。
如何导入程序集?
一般根目录下,有着.csproj后缀的文件,该文件有着创建应用程序所需的引用、数据连接、文件夹和文件的信息。
比方说,我现在有如下程序集需要导入,路径在
那么,我只需要到.csproj后缀的文件下,添加对应xml节点即可完成导入
当然,现在的IDE工具,我们直接使用其导入功能就可以了,效果跟上面是一样的,导入完后就可以在IDE中查看到哪些程序集被导入了
编译出来的程序集在哪里?目录下各个文件分别代表什么?
.net的编译目录一般在(可以通过配置管理器修改,默认用Debug,另一个是Release)
重要
.exe和.dll都是程序集
.exe称为可执行文件,包含数据和代码
.dll称为动态链接文件,纯资源文件,只包含数据,不含程序代码
比较简单的理解就是.exe有Main函数方法作为程序的入口,.dll更多是作为引用使用
次要
.deps.json 存放依赖关系的文件
.runtimeconfig.json 存放运行时配置信息的文件
.pdb(程序数据库)文件保持着调试和项目状态信息,从而可以对程序的调试配置进行增量链接
补充
Unity中查看文件属于哪个程序集
单击文件,在Inspector窗口即可看见