深入理解.net framwork中的Application domain(應用域) 概念

appDomain是.NET框架獨有的概念。找不到其他技術體系中貼切的參照概念,是微軟自己的東東。很多人認爲可以同進程的概念相同,我很不贊同:其一,“進程”是操作系統中的概念,在虛擬機/框架之類的體系中有着自己的定義和功能,顯然這樣理解appDomain是錯誤的。
現在是虛擬機時代了,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/7234 ... /20030819/1722679_2.shtml

http://www.microsoft.com/china/msdn/l ... l/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.WebDN.com/web_file/program/asp.net/06020806153.asp



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、動態加載一些程序。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章