程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> System.AppDomain類詳解

System.AppDomain類詳解

編輯:C#基礎知識

  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 ValueExpected Domains in ProcessEach Domain Expected to Run ...Code for MSCORLIBCode for Assemblies in GACCode 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     1.SingleDomain,由於只啟動一個AppDomain,那麼code就被直接裝載到了AppDomain中,訪問靜態變量更快捷。     2.MultiDomain,所有的Assembly代碼是進程級別的,因此所有的AppDomain只訪問一份代碼。這大大減少了程序占用的內存,但是由於程序集的靜態變量仍然在各個AppDomain中,因此代碼訪問靜態變量需要先得到AppDomain的引用再進行轉換,速度會受到影響。     3.MultiDomainHost,只有GAC代碼是共享的,非GAC的Assembly依然會加載到被使用的AppDomain中,這樣提高靜態變量的訪問速度,當然也增加程序占用內存。      不管是哪種方式,mscorlib始終是process級別的,即只有一份mscorlib代碼在內存中。     詳細參考:http://www.cnblogs.com/foman/archive/2009/10/18/1585655.html

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved