ASP.net:理解AppDomain

来源:互联网 发布:java mysql增删改查 编辑:程序博客网 时间:2024/06/06 04:10

目前是虚拟机时代了,Java称作JVM(Java 虚拟机),.NET称作 FrameWork(框架)。对照着两个体系,当中有非常多异同,不过我感兴趣的是.NET中称作“AppDomain”(应用程式域)的东东。这个概念怎么准确的理解,对于.NET研发来讲有何意义?使用他需要注意些什么?

微软的.NET文件中appDomain的解释相当简略(却不是非常清晰J): “一个应用程式在其中执行的独立环境”。为执行托管代码提供隔离、卸载和安全边界。到底怎么理解呢?我想是不是能这样来准确体会这个概念:

1、appDomain是.NET框架独有的概念。未找到其他技术体系中贴切的参照概念,是微软自己的东东。非常多人认为能同进程的概念相同,我非常不赞同:其一,“进程”是操作系统中的概念,在虚拟机/框架之类的体系中有着自己的定义和功能,显然这样理解appDomain是错误的;其二,“在应用程式域和线程之间没有一对一的关联,多个线程能属于一个应用程式域,尽管给定的线程并不局限于一个应用程式域,但在所有给定时间,线程都在一个应用程式域中执行。”(.NET FrameWork SDK 中的描述),如果这里的“应用程式域”换成“进程”讲得通么?

2、隔离性。也不怪有人直接套解为进程,AppDomain有着代码执行隔绝的特性,就似乎进程做的相同。appDomain的对象、代码能认为相互隔离,甚至一个appDomain中的代码调用另外appDomain的对象(的数据或方法等),需要类似DCOM中的“列集/散集”才能进行(在类继承关系中appDomain类 继承自 MarshalByRefObject类)。每一个appDomain能独立被调试、启动、停止,有着自己的默认的异常处理,一个appDomain崩溃了,不会影响其他的appDomain。能理解为.NET的“逻辑进程”。

.NET中允许同一个应用程式的不同版本能并存,消除了所谓的“dll hell”。通过创建不同的appDomain,我们能让某个托管的程式集的1.0和2.0的版本同时执行(只要他们自身并不存在某个特定资源的非兼容性的存取访问)

       3、安全性。由于代码隔离,能防止某个危险代码对于其他的appDomain的影响。而且能通过分配特定的安全分配,确定appDomain中的执行代码对于系统安全保护资源的访问。

       4、独立性。每一个appDomain都由.NET的框架分配了专用的存储区(应用域局部存储)。所有对象都能访问自己当前所在的appDomain的局部存储区,这个局部存储区被整个appDomain中的对象共享,也包括进入appDomain的线程(运行于同一个appDomain的线程能通过这个局部存储进行通信)。

       5、同进程、线程、程式集的关系。同进程属于多对一的关系,即一个进程中能有多个appDomain,不过appDomain只能存在于某个进程中(显然,正如同上文:进程同appDomain属于不同的概念)。缺省情况下,如果你没有自己创建多个appDomain,一个进程启动后自动创建一个appDomain。而线程执行能涉及多个appDomain,但某个特定时刻,线程仅存在于一个appDomain中,且线程能进入其他的appDomain。某个程式集的某个实例属于具体的appDomain,由appDomain在自己的范围内加载,并按照程式集创建相应的对象。AppDomain是程式集的执行环境,同时程式集作为静态实体,能被多个appDomain加载执行。

   非常多人文章讲了相关的编程(但没有将清晰什么是appDomain),鄙人也不想抄,基本上涉及appDomain的创建、卸载、获得当前appDomain实例、操作appDomain、appDomain中创建对象调用对象、加载特定程式集、执行程式、appDomain之间协调(回调、事件等)。能参考我收集的一些URL:

appDomain参考

http://tech.ccidnet.com/pub/article/c1136_a30763_p1.html

http://www.yesky.com/SoftChannel/72342380484755456/20030819/1722679_2.shtml

http://www.microsoft.com/china/msdn/library/dncscol/html/csharp05162002.asp

http://wwwb.pconline.com.cn/pcedu/empolder/gj/vb/doc/10712_2.htm

http://www.csdn.net/Develop/Read_Article.asp?Id=19285

http://www.csdn.net/Develop/Read_Article.asp?Id=13303

      

       SDK文件中的参考:

       ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemappdomainclasstopic.htm

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemappdomainmemberstopic.htm

  通过前面讨论知道,其实在一般情况下我们是不必理会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、动态加载一些程式。

    其他应用等待大家补充:)

原创粉丝点击