.net appDomain 詳解

ForTechnology發表於2011-12-01
現在是虛擬機器時代了,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/frlrfsys
通過前面討論知道,其實在一般情況下我們是不需要理會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、動態載入一些程式。
    其它應用等待大家補充:)

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-712502/,如需轉載,請註明出處,否則將追究法律責任。

相關文章