AppDomain

AppDomain可以视为一种轻量级进程,AppDomain可以像进程一样独立加载Assembly。一个Windows进程可以包含多个AppDomain。但是与进程不同的是,进程与线程有隶属关系,但是,AppDomain和进程之间是正交的,他们没有隶属关系。例如,一个进程存在两个AppDomain:ADA和ADB,对象A来自ADA,对象B来自ADB,如果A的某个方法调用了B的方法,这两个方法会在同一个线程中执行。
使用AppDomain的好处
创建AppDomain所需要的系统资源比创建一个Windows进程要少;
同一个Windows进程内的AppDomain之间可以共享资源,如地址空间、线程、CLR等等;
Notice:
当AppDomain加载了某个Assembly后,就不能再将它从AppDomain中卸载掉,除非将整个AppDomain卸载,但是卸载AppDomain会产生非常严重的后果。
AppDomain的孤立性
1.
2.
3.
Host and Hosting
CLR并没有和操作系统集成,进程创建时必须由自己完成加载CLR的操作。加载CLR是由运行库宿主(Runtime Host)来完成的,Host的非托管代码部分负责CLR的加载、配置以及将当前线程转交给托管代码,CLR加载完成后,Host还要负责处理未捕获的异常等任务。一个CLR宿主与操作系统,以及CLR的关系如下图所示。

不同的运行库宿主将会影响应用程序的性能,还可以定义应用程序可用的功能。微软预提供的Runtime Host包括:

  1. Console和WinForm 运行库宿主:执行的程序集在默认的AppDomain中加载,隐式加载的程序集被加载到与引用程序集所在的同一个AppDomain中,这类应用程序无需使用除默认AppDomain之外的域;
  2. ASP.Net运行库宿主:为每一个Web应用程序创建一个AppDomain;
  3. Microsoft IE运行库宿主:默认情况下,这个Host为每一个被访问的Web站点创建一个AppDomain,这样可以允许每个站点使用不同的安全级别;
  4. SQL Server 2005运行库宿主:允许数据库的查询请求使用IL代码编写;

弱引用
在应用程序执行期间,每个对象在任意时刻要么是活动的,也就是有引用指向这个对象;要么就是非活动的,也就是没有引用指向这个对象,也就不能再访问这个对象了。为了满足一些应用程序(比如缓存等)的需要,对象还可以有第三种中间状态,如果对象处于这样的状态,应用程序还可以访问这个对象,GC也可以随时释放它。要使对象处于这样的状态就需要使用弱引用(weak reference)来引用对象。使用弱应用引用的对象就既可以被应用程序访问,又可以被GC回收。