程序集与AppDomain

来源:互联网 发布:公司取名软件crsky 编辑:程序博客网 时间:2024/04/30 19:50

1.程序集就是元数据、代码或资源的逻辑组。

程序集的作用:为CLR执行的代码提供一个容器;创建一个安全入口;为类型定义提供一个容器;作为版本控制的目标;作为部署的逻辑单元。

程序集有两种分类:静态程序集和动态程序集。静态程序集就是保存在磁盘上的程序集,可以是单个或一组文件。动态程序集只存在于内存中,通过反射代码,可以直接将代码发送到内存中,再进行编译执行。

另外,程序集也可以分为:多文件程序集和单文件程序集。

 

2.程序集清单:即数据信息的集合,其中的信息不但描述了程序集本身,而且描述了程序集的各种组件以及组件之间的关系。清单中包含了程序集元数据,并且可以保存在可移植可执行文件中。

ILDASM.EXE可以用来检查一个程序集清单。

元数据:描述了程序集的功能、内容和引用。代码属性也是元数据。

程序集中还可以保存资源。这些资源可以直接嵌入到程序集主体中,也可以从外部链接到程序集中。

 

3.AppDomain:可以看作是CLR的沙箱,即由运行时宿主分割的内存空间。同CLR为将应用程序彼此隔离而使用的内存构造。也是.NET Framework提供的一个类。

AppDomain类的常用方法

CreateDomain():这个静态方法会在当前CLR宿主进程的内存中创建一个新的AppDomain。该方法可以接受各种参数,作为新AppDomain的惟一标识。

CreateInstanceFrom():这个方法在给定的AppDomain中创建AppDomain类型的实例。如果使用new运算符,那么会在当前AppDOmain中创建实例。使用这个方法则能够在其他AppDomain中创建实例。

Load():将程序集加载到指定的AppDomain中。

Unload():卸载给定的AppDomain。注意,无法从AppDomain中移除单个程序集,只能卸载整个AppDomain。

GetAssemblies():这个方法会列出AppDomain当前加载的所有程序集。

GetData():就像CallContext那样,可以在AppDomain中存储键/值对。这个方法可以检索AppDomain的命名值。

SetData():这个方法可以设置AppDomain中的命名值。

AppDomain类的属性

BaseDirectory:获取基目录,加载程序集时会先搜索基目录。

CurrentDomain:这个静态方法能够获取当前活动AppDomain的实例,代码在该AppDomain中运行。

Evidence:包括当前AppDomain的标识符信息。

FriendlyName:表示AppDomain的FriendlyName。大部分情况下,为可执行程序的名称。

SetupInformation:该属性类型为AppDomainSetup,其中包含了程序集绑定数据,如下载缓存信息、基目录、搜索路径等。

 

4.插件的原理:当第三方开发人员创建插件时,必须遵循一些预先制订的规则(接口)。在主程序中查看指定目录中的所有文件,然后列出该目录文件中的所有可用插件,并检索这个插件列表。

注:加载插件时,一般会创建一个新的AppDomain并在该AppDomain中实例化一个类型。这样,这个类型就可以识别指定目录中的插件,并加载这些插件,当搜索完成后,卸载这个临时AppDomain即可释放空间。