AppDomain是CLR(Common Language Runtime:公共語言運行庫),它可以載入Assembly、創建對象以及執行程式。 AppDomain是CLR實現代碼隔離的基本機制。 每一個AppDomain可以單獨運行、停止;每個AppDomain都有自己預設的異常處理;一個AppD
AppDomain是CLR(Common Language Runtime:公共語言運行庫),它可以載入Assembly、創建對象以及執行程式。
AppDomain是CLR實現代碼隔離的基本機制。
每一個AppDomain可以單獨運行、停止;每個AppDomain都有自己預設的異常處理;一個AppDomain的運行失敗不會影響到其他AppDomain的運行。
CLR在被CLR Host(windows shell or InternetExplorer or SQL Server)載入後,會創建一個預設的AppDomain,程式的入口點(main方法)就是在這個預設的AppDomain中執行。
1、AppDomain與進程比較:
AppDomain被創建是在進程中,一個進程中可以有多個AppDomain,但一個AppDomain只能屬於一個進程。
2、AppDomain與線程比較:
與線程,Appdomain是個靜態概念,知識限定了對象的邊界;線程是個動態的概念,它可以運行在不同的AppDomain中。一個AppDomain內可以創建多個線程,但是不能限定這些線程只能在本AppDomain內執行代碼。
CLR中的System.Threading.Thread對象其實是個soft thread,它並不能被操作系統識別;操作系統能識別的是hard thread。一個soft thread只屬於一個ppDomain,穿越AppDomain的是hard thread。當hard thread訪問到某個AppDomain時,一個AppDomain就會產生一個soft thread。
hard thread有thread local storage(TLS),這個存儲區被CLR用來存儲hard thread當前對應的AppDomain引用以及soft thread引用。當一個hard thread穿越到另外一個AppDomain時,TLS中的這些引用也會改變。
3、AppDomain與Assembly的比較:
Assembly是.net程式的基本部署單元,它可以為CLR提供識別類型的元數據等等。Assembly不能單獨執行,必須被載入到AppDomain中,然後由AppDomain創建程式集中的對象。一個Assembly可以被多個AppDomain載入,一個AppDomain可以載入多個Assembly。每個AppDomain引用到某個類型的時候需要把相應的assembly在各自的AppDomain中初始化。因此,每個AppDomain會單獨保持一個類的靜態變數。
4、AppDomain與對象的比較:
任何對象只能屬於一個AppDomain,AppDomain用來隔離對象,不同AppDomain之間的對象必須通過Proxy(reference type)或者Clone(value type)通信。
引用類型需要繼承System.MarshalByRefObject才能被Marshal/UnMarshal(Proxy)。
值類型需要設置Serializable屬性才能被Marshal/UnMarshal(Clone)。
5、AppDomain與Assembly Code
AppDomain和程式集的源代碼是什麼關係呢?每個程式集的代碼會分別裝載到各個AppDomain中?首先我們要把程式集分3類
1.mscorlib,這是每個.net程式都要引用到的程式集。
2.GAC,這個是強命名的公用程式集,可以被所有的.net程式引用。
3.Assembly not in GAC,這是普通的assembly,可以不是強命名,不放到GAC中。 啟動CLR,進入entry point時可以設置LoaderOptimization屬性: [LoaderOptimization(LoaderOptimization.MultiDomain]
static void Main()
{...} LoaderOptimization屬性可以設置三個不同的枚舉值,來設置針對前面說的三種程式集的代碼存放以及訪問方式。 LoaderOptimization Enumeration/Attribute
Value | Expected Domains in Process | Each Domain Expected to Run ... | Code for MSCORLIB | Code for Assemblies in GAC | Code for Assemblies not in GAC |
---|---|---|---|---|---|
SingleDomain | One | N/A | Per-process | Per-domain | Per-domain |
MultiDomain | Many | Same Program | Per-process | Per-process | Per-process |
MultiDomainHost | Many | Different Programs | Per-process | Per-process | Per-domain |