理解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/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、動態加載一些程序。

          其它應用等待大家補充:)

發佈了1 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章