让我们在开始本节内容之前先了解以下几个基本概念。
应用程序域
应用程序域(通常简称为AppDomain)可以视为一种轻量级进程。一个Windows进程内可以包含多个AppDomain。AppDomain这个概念的提出是为了实现在一个物理服务器中承载多个应用程序,并且这些应用能够相互独立。ASP.NET中利用AppDomain在同一个进程内承载了多组Web应用程序就是一个例子。实际上微软曾进行过在单一进程内承载多达1000个简单Web应用程序的压力测试。
使用AppDomain所获得的性能优势主要体现在两方面:
·创建AppDomain所需要的系统资源比创建一个Windows进程更少。
·同一个Windows进程内所承载的AppDomain之间可以互相共享资源,如CLR、基本.NET类型、地址空间以及线程。
而各个AppDomain之间的独立性体现为以下这些特征:
·一个AppDomain可以独立于其他的AppDomain而被卸载。
·一个AppDomain无法访问其他AppDomain的程序集和对象。
·若没有发生跨边界的异常抛出,一个AppDomain拥有自己独立的异常管理策略。这意味着一个AppDomain内出现问题不会影响到同一个进程内中的其他AppDomain。
·每个AppDomain可以分别定义独自的程序集代码访问安全策略。
·每个AppDomain可以分别定义独自的规则以便CLR在加载前定位程序集所在位置。
可以看出应用程序域是进程中的一个子单元,不过在.NET中还存在一个比应用程序域还要细粒度的单元——.NET上下文(Context)。
.NET Context
一个.NET 应用程序域能够包含多个被称为.NET上下文的实体。所有.NET对象都存在于上下文中,每个应用程序域中至少存在一个上下文。这个上下文称为应用程序域的默认上下文,它在应用程序域创建的时候就创建了。下图总结了它们之间的关系: