Enter the .Net AppDomain

 

介绍应用程序域 

        一个应用程序域是一组程序集的一个逻辑容器。CLR初始化时创建的第一个应用程序域称作默认应用程序域(Default AppDomain),该应用程序域只有在Windows进程中断时才会被销毁。
       除了默认的应用程序域外,一个宿主还可以指示CLR创建额外的应用程序域。另外,托管程序集中的代码也可以告诉CLR创建额外的应用程序域。创建一个应用程序域方法很简单,
AppDomain DomainA = AppDomain.CreateDomain("MyDomainA");
       
       应用程序域有三个非常有用的特点:
       1.应用程序域之间是相互隔离的
           一个应用程序域看不到另一个应用程序域的对象。这种清晰的隔离是强制的,应为一个应用程序域的代码 不能直接引用另一个程序域中创建的对象。
       2.应用程序域是可卸载的
           CLR不支持单个程序集的卸载。但是,我们可以告诉CLR去卸载整个应用程序域和他所包含的所有Assembly。
       3.应用程序域可以单独实施安全策略和配置策略

何时需要创建应用程序域

         何时需要创建应用程序域,这是最初我对.NET中引入AppDomain的最大迷惑,既然CLR初始化时创建的第一个应用程序域称作默认应用程序域我们为什么要自己去创建呢?带着这个问题,我在网上查了一些文章的内容,我觉得很有道理。
       通过前面讨论知道,其实在一般情况下我们是不需要理会AppDomain的,不过,出现此概念在.NET中决非多余,有着自己存在的理由,那么具体载那些情境下要使用AppDomain呢?

1、 需要隔离的程序集,譬如一些特别容易引起崩溃的代码可以考虑单独运行于一个特定的AppDomain。
2、 不同安全级别的程序集,如果需要为自己的代码划分安全执行的边界,可以考虑将不同安全级别的代码单独创建于某个设定了不同安全信息的AppDomain。
3、 从 性能上考虑,有些程序集可能会消耗大量资源,尽管在托管环境下,基本上不存在资源消耗漏洞,但是总会存在特定时间访问密集造成消耗大量资源的情况,这时可 以考虑创建单独的AppDomain,在资源消耗超过临界点后进行AppDomain的卸载,适应系统运行要求。Asp.net中利用不同得 AppDomain来提供支持就是为了防止一个应用程序的崩溃影响其他asp.net应用程序,同时,在不重新启动的系统不重新启动IIS不影响 asp.net自身服务提供的情况下将一个AppDomain卸掉同时启动新的AppDomain,理想情况下可以实现web系统的长时间在线(这以往是 昂贵的unix的特性,终于被MS“借鉴”了)。
4、 不同版本的同一应用程序集的同时运行。这个在COM时代是一个大问题,现在通过appDomain,实现了在一个进程中执行版本不同的两个程序集,可以做到良好的兼容性。
5、动态加载一些程序。
          其它应用等待大家补充:)

        
      

posted @ 2012-04-11 16:18  linyliny  阅读(131)  评论(0)    收藏  举报