【CLR Via C#】2 程序集
1 定义:
- 程序集是net 应用程序的部署单元,是组件服用,以及实施安全策略和版本策略的最小单元。
- 程序集是包含一个或者多个类型定义文件和资源的集合
net 程序集包含元数据(注:描述了程序集中定义的所有类型及其成员信息,即方法、属性、事件和字段)
2 结构:
这些结构可以在一个文件中也可以在几个文件中。分布在一个文件中的情况是如上图所示,对于分布到不同文件下,如图2-2
3 私有程序集和共享程序集
- 私有程序集:默认是私有程序集,位于应用程序所在的同一个目录下,或者位于其子目录中。
- 共享程序集:必须有一个版本号,通常安装在(global assembly cache位于Windows/assembly)。任何程序都可以引用他;一般在一个大型应用程序分布在几个子项目中是,常常需要使用共享程序集。
- 强名:为了保护共享程序集的唯一性,我们必须在共享程序集上加上密钥。如果密钥不同即使两个组件名称相同也不是同一个组件。
4 创建程序集
对应于上面第二点说明的一个程序集中分别在不同的文件中。这其中模块的作用其一模块能够更快的启动程序集,并且并不是所有类型都在一个文件中;其二在使用多种编程语言来创建一个程序集(如:一个模块用vb编写,另外一个模块用c#编写,并且这两个模块都包括在一个程序集中。如下图的例子,就是印证第二点的多个文件创建程序集
5 应用程序域
Dot Net 建立的可执行程序.exe;并没有直接挂载到进程中,而是承载在应用程序域上。应用程序域可以看成轻量级别的进程。一个应用程序域可以装载一个可执行程序exe或者多个程序集。AppDomain 类用于创建和终止应用程序域,加载和卸载程序集和类型,以及枚举应用程序域中的程序集和线程。
- 对于用AppDomain进行创建应用程序域并且加载程序集,例子如下所示
//文件2.cs using System; public class Bar { public static void Main() { Console.WriteLine("Bar"); } }
//1.cs using System; using System.Reflection; public class temp{ public static void Main() { AppDomain testDomain=AppDomain.CreateDomain("TestDomain"); Console.WriteLine(testDomain.FriendlyName);//"TestDomain" //通过调用程序集2.exe,并且执行输出“bar” testDomain.ExecuteAssembly("2.exe"); } }
- 对于销毁应用程序域可以直接调用:AppDomain.Unload(testDomain);可以直接销毁应用程序域