寄宿
概念
在搞明白寄宿这个概念前,首先我们要明白非托管代码如何去调用托管代码的?我们知道,一个托管应用程序首先被操作系统启动,然后由操作系统调用CLR来托管该程序。那么.NET框架到底以什么方式让操作系统来认识它并且可以启动它呢?微软实际将其作为COM服务器实现在一个DLL中,并提供了标准的COM接口。既然是COM服务,也就意味着普通的非托管程序也可以调用CLR来运行托管代码,把这种调用方式叫做寄宿,把调用CLR的非托管程序叫做宿主。
寄宿不仅使应用程序可以调用CLR,还可以通过它来进行内存管理、垃圾回收管理、策略管理、事件管理以及线程控制等高级管理。
AppDomain
概念
CLR COM服务器服务器初始化时会创建一个AppDomain,AppDomain是一组程序集的逻辑容器。
CLR初始化时创建的第一个AppDomain称为默认AppDomain,这个默认的AppDomain只有在windows进程终止时才会被注销。
除了默认AppDomain,正在使用非托管com接口方法或托管类型方法的宿主还可要求CLR创建额外的AppDomain。AppDomain是为了提供隔离而设计的。
具体功能
-
一个AppDomain的代码不能直接访问另一个AppDomain的代码创建的对象
-
AppDomain可以卸载
CLR不支持从AppDomain中卸载特定的程序集。但可以告诉clr卸载一个AppDomain,从而卸载该AppDomain当前包含的所有程序集。
-
AppDomain可以单独保护
AppDomain创建后会应用一个权限集,它决定了向这个AppDomain中运行的程序集授予的最大权限。
-
AppDomain可以单独配置
AppDomain创建后会管理一组配置设置。