理解AppDomain
| [日期:2003-12-11] | 來源:CSDN? 作者:shanhe | [字體:大 中 小] |
現在是虛擬機時代了,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、動態加載一些程序。
????????? 其它應用等待大家補充:)
總結
以上是生活随笔為你收集整理的理解AppDomain的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sql Server 分区演练
- 下一篇: 普通行列转换(交叉表,横表变列表)