理解AppDomain
| [日期:2003-12-11] | 來源:CSDN? 作者:shanhe | [字體:大 中 小] |
現(xiàn)在是虛擬機時代了,Java稱作JVM(Java 虛擬機),.NET稱作 FrameWork(框架)。對照著兩個體系,當(dāng)中有很多異同,不過我感興趣的是.NET中稱作“AppDomain”(應(yīng)用程序域)的東東。這個概念如何準確的理解,對于.NET開發(fā)來講有何意義?使用它需要注意些什么?
?
微軟的.NET文檔中appDomain的解釋相當(dāng)簡略(卻不是很清楚J): “一個應(yīng)用程序在其中執(zhí)行的獨立環(huán)境”。為執(zhí)行托管代碼提供隔離、卸載和安全邊界。到底如何理解呢?我想是不是可以這樣來準確體會這個概念:
1、appDomain是.NET框架獨有的概念。找不到其他技術(shù)體系中貼切的參照概念,是微軟自己的東東。很多人認為可以同進程的概念相同,我很不贊同:其一,“進程”是操作系統(tǒng)中的概念,在虛擬機/框架之類的體系中有著自己的定義和功能,顯然這樣理解appDomain是錯誤的;其二,“在應(yīng)用程序域和線程之間沒有一對一的關(guān)聯(lián),多個線程可以屬于一個應(yīng)用程序域,盡管給定的線程并不局限于一個應(yīng)用程序域,但在任何給定時間,線程都在一個應(yīng)用程序域中執(zhí)行。”(.NET FrameWork SDK 中的描述),如果這里的“應(yīng)用程序域”換成“進程”講得通么?
2、隔離性。也不怪有人直接套解為進程,AppDomain有著代碼執(zhí)行隔絕的特性,就好像進程做的一樣。appDomain的對象、代碼可以認為相互隔離,甚至一個appDomain中的代碼調(diào)用另外appDomain的對象(的數(shù)據(jù)或者方法等),需要類似DCOM中的“列集/散集”才可以進行(在類繼承關(guān)系中appDomain類 繼承自 MarshalByRefObject類)。每一個appDomain可以單獨被調(diào)試、啟動、停止,有著自己的默認的異常處理,一個appDomain崩潰了,不會影響其他的appDomain。可以理解為.NET的“邏輯進程”。
.NET中允許同一個應(yīng)用程序的不同版本可以并存,消除了所謂的“dll hell”。通過創(chuàng)建不同的appDomain,我們可以讓某個托管的程序集的1.0和2.0的版本同時執(zhí)行(只要他們自身并不存在某個特定資源的非兼容性的存取訪問)
?????? 3、安全性。由于代碼隔離,可以防止某個危險代碼對于其他的appDomain的影響。而且可以通過分配特定的安全分配,確定appDomain中的執(zhí)行代碼對于系統(tǒng)安全保護資源的訪問。
?????? 4、獨立性。每一個appDomain都由.NET的框架分配了專用的存儲區(qū)(應(yīng)用域局部存儲)。任何對象都可以訪問自己當(dāng)前所在的appDomain的局部存儲區(qū),這個局部存儲區(qū)被整個appDomain中的對象共享,也包括進入appDomain的線程(運行于同一個appDomain的線程可以通過這個局部存儲進行通信)。
?????? 5、同進程、線程、程序集的關(guān)系。同進程屬于多對一的關(guān)系,即一個進程中可以有多個appDomain,但是appDomain只能存在于某個進程中(顯然,正如同上文:進程同appDomain屬于不同的概念)。缺省情況下,如果你沒有自己創(chuàng)建多個appDomain,一個進程啟動后自動創(chuàng)建一個appDomain。而線程執(zhí)行可以涉及多個appDomain,但某個特定時刻,線程僅存在于一個appDomain中,且線程可以進入其他的appDomain。某個程序集的某個實例屬于具體的appDomain,由appDomain在自己的范圍內(nèi)加載,并按照程序集創(chuàng)建相應(yīng)的對象。AppDomain是程序集的執(zhí)行環(huán)境,同時程序集作為靜態(tài)實體,可以被多個appDomain加載執(zhí)行。
?
很多人文章講了相關(guān)的編程(但沒有將清楚什么是appDomain),鄙人也不想抄,基本上涉及appDomain的創(chuàng)建、卸載、獲得當(dāng)前appDomain實例、操作appDomain、appDomain中創(chuàng)建對象調(diào)用對象、加載特定程序集、執(zhí)行程序、appDomain之間協(xié)調(diào)(回調(diào)、事件等)。可以參考我收集的一些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的,不過,出現(xiàn)此概念在.NET中決非多余,有著自己存在的理由,那么具體載那些情境下要使用appDomain呢?
1、? 需要隔離的程序集,譬如一些特別容易引起崩潰的代碼可以考慮單獨運行于一個特定的appDomain
2、? 不同安全級別的程序集,如果需要為自己的代碼劃分安全執(zhí)行的邊界,可以考慮將不同安全級別的代碼單獨創(chuàng)建于某個設(shè)定了不同安全信息的appDomain
3、? 從性能上考慮,有些程序集可能會消耗大量資源,盡管在托管環(huán)境下,基本上不存在資源消耗漏洞,但是總會存在特定時間訪問密集造成消耗大量資源的情況,這時可以考慮創(chuàng)建單獨的appDomain,在資源消耗超過臨界點后進行appDomain的卸載,適應(yīng)系統(tǒng)運行要求。Asp.net中利用不同得appDomain來提供支持就是為了防止一個應(yīng)用程序的崩潰影響其他asp.net應(yīng)用程序,同時,在不重新啟動的系統(tǒng)不重新啟動IIS不影響asp.net自身服務(wù)提供的情況下將一個appDomain卸掉同時啟動新的appDomain,理想情況下可以實現(xiàn)web系統(tǒng)的長時間在線(這以往是昂貴的unix的特性,終于被MS“借鑒”了)。
4、? 不同版本的同一應(yīng)用程序集的同時運行。這個在COM時代是一個大問題,現(xiàn)在通過appDomain,實現(xiàn)了在一個進程中執(zhí)行版本不同的兩個程序集,可以做到良好的兼容性。
5、動態(tài)加載一些程序。
????????? 其它應(yīng)用等待大家補充:)
總結(jié)
以上是生活随笔為你收集整理的理解AppDomain的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sql Server 分区演练
- 下一篇: 普通行列转换(交叉表,横表变列表)