青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

APPDomain,Assabley,madel,namespace 概念

現在是虛擬機時代了, 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、動態加載一些程序。

其它應用等待大家補充:)

我們知道,進程是操作系統用于隔離眾多正在運行的應用程序的機制。在.Net之前,每一個應用程序被加載到單獨的進程中,并為該進程指定私有的虛擬內存。進程不能直接訪問物理內存,操作系統通過其它的處理把這些虛擬內存映射到物理內存或IO設備的某個區域,而這些物理內存之間不會有重疊,這就決定了一個進程不可能訪問分配給另一個進程的內存。相應地,運行在該進程中的應用程序也不可能寫入另一個應用程序的內存,這確保了任何執行出錯的代碼不會損害其地址空間以外的應用程序。在這種機制下,進程作為應用程序之間一個獨立而安全的邊界在很大程度上提高了運行安全。

進程的缺點是降低了性能。許多一起工作的進程需要相互通信,而進程卻不能共享任何內存,你不能通過任何有意義的方式使用從一個進程傳遞到另一個進程的內存指針。此外,你不能在兩個進程間進行直接調用。你必須代之以使用代理,它提供一定程度的間接性。雖然,使用動態連接庫dll讓所有的組件運行在同一空間,一定程度上可以提高性能,但這些組件相互影響,一個組件的錯誤將極有可能導致整個應用程序的崩潰,“dll地獄”更是讓許多應用程序難以避免。


應用程序域(AppDomain)
在.Net中,應用程序有了一個新的邊界:應用程序域(以下簡稱域)。它是一個用于隔離應用程序的虛擬邊界。為了禁止不應交互的代碼進行交互,這種隔離是必要的。.Net的應用程序在域層次上進行隔離,一個域中的應用程序不能直接訪問另一個域中的代碼和數據。(可以間接啊)這種隔離使得在一個應用程序范圍內創建的所有對象都在一個域內創建,確保在同一進程中一個域內運行的代碼不會影響其他域內的應用程序,大大提高了運行的安全。

.Net結構中,由于公共語言運行庫能夠驗證代碼是否為類型安全的代碼,所以它可以提供與進程邊界一樣大的隔離級別,其性能開銷也要低得多。你可以在單個進程中運行幾個域,而不會造成進程間調用或切換等方面的額外開銷。這種方法是把任何一個進程分解到多個域中,允許多個應用程序在同一進程中運行,每個域大致對應一個應用程序,運行的每個線程都在一個特殊的域中。如果不同的可執行文件都運行在同一個進程空間中,它們就能輕松地共享數據或直接訪問彼此的數據。這種代碼同運行同一個進程但域不同的類型安全代碼一起運行時是安全的。在一個進程內運行多個應用程序的能力顯著增強了服務器的可伸縮性。


域間通信
域是.Net 帶來的一個重要改進,它不僅將眾多在運行的應用程序隔離開來,還不影響彼此間通信。雖然,公共語言運行庫禁止在不同域中的對象之間進行直接調用,但我們可以復制這些對象,或通過代理訪問這些對象。如果以前一種方式,那么對該對象的調用為本地調用。也就是說,調用方和被引用的對象位于同一域中。如果通過代理訪問對象,調用方和被引用的對象位于不同的域中,對該對象的調用被視為遠程調用,這種情形與兩個進程間的調用或兩臺計算機間的調用結構大致相同。這時,需要被引用對象的元數據對于兩個域均可用,以便.Net即時編譯JIT能正確執行。


域與線程的關系
在.Net中,線程是公共語言運行庫用來執行代碼的操作系統構造。在運行時,所有托管代碼均加載到一個域中,由特定的操作系統線程來運行。然而,域和線程之間并不具有一一對應關系。在任意給定時間,單個域中可以執行不止一個線程,而且特定線程也并不局限在單個域內。也就是說,線程可以跨越域邊界,不為每個域創建新線程。當然,在指定時刻,每一線程都只能在一個域中執行。運行庫會跟蹤所有域中有哪些線程正在運行。通過調用.Net類庫的 Thread.GetDomain 方法,你還可以確定正在執行的線程所在的域。


域的創建
作為公共語言運行庫的隔離單元,域在進程中創建和運行。.Net結構中,運行時宿主(也叫作運行時主機)是負責將運行時載入進程并在域中執行用戶代碼和托管代碼的應用程序。運行時宿主包括ASP.Net、瀏覽器Internet Explorer 和 Windows等外殼程序,負責創建進程和默認域,例如,Asp.Net為每個運行在web服務器上的web應用程序創建一個域。瀏覽器Internet explore創建運行受管制控件的域。

對多數應用程序,你并不必須創建相應的域,每次CLR在初始化一個進程時,將創建默認域,并使該進程運行于這個默認域下。然而,默認域不能由任何系統調用來卸載,該域只有在進程被卸載之后才能被銷毀。如果直接在默認域下編程或運行代碼,而由于某種原因域的代碼崩潰了,那么就有使得整個服務隨之崩潰的風險。

于是,針對不同的應用程序,應該創建和配置相應的域并載入適當的程序集。.Net為此提供了豐富的類庫。其中,AppDomain 類是域的編程接口,其大量的(重載)方法能完成以下任務:

· 創建域

· 在域中加載程序集和類型

· 枚舉域中的程序集和線程

· 卸載域

創建新域時,使用AppDomain 類的靜態方法CreateDomain。你可以為域命名并按該名稱來引用域。下面的示例語句創建新域,并為它指定名稱 MyDomain:                AppDomain myDomain = AppDomain.CreateDomain("MyDomain");
然后你可以查詢當前域的名稱和新創建子域的名稱:                 string hostDomain=AppDomain.CurrentDomain.FriendlyName;
string childDomain=myDomain.FriendlyName;

在這里,屬性FriendlyName表示的是域的友好名稱,友好名稱通過從程序集的基本代碼中去除目錄路徑而形成。例如,文件名為 "d:\MyAppDomain\MyAssembly.exe" 的程序集加載到默認域中,域的友好名稱就是 "MyAssembly.exe"。

更一般的是,在創建域之前,先設置好域的參數,這可以通過類AppDomainSetup來完成。該類的ApplicationBase 屬性定義應用程序的根目錄, AppDomainSetup 類還有一個極重要的屬性變量LoaderOptimizzation,取值可以是MultiDomain,MultiDomainHost和SignleDomain等,用以指定被加載程序集的類別(共享程序集或域專用程序集),例如,以下語句把程序集設置為域專用程序集:          appDomainSetup.LoaderOptimization=LoaderOptimizatiion.SigleDomain;

對以上兩個方面簡單歸納一下,對域的典型操作就包括:設置參數然后創建兩個步驟,語句示例如下:           AppDomainSetup appDomainSetup=new AppDomainSetup();//實例化域設置
appDomainSetup.LoaderOptimization=LoaderOptimization.SingleDomain; //指定域類別
AppDoman ad=AppDomain.CreateDomain(domainName,appDomainSetup); //創建域
...
//應用程序在這里運行代碼
...
AppDomain.Unload(ad);//卸載域

卸載域
當使用完域時,可使用AppDomain類Unload()靜態方法將其卸載。要卸載進程中在運行的托管代碼,只能卸載代碼運行時所在的域而不能卸載單獨的程序集或類型,Unload方法會正常關閉指定的域。這時,載入域的所有程序集都會被移除,并且無法再使用。不過,如果域中的程序集對域是非特定的(域無關程序集,也即共享程序集),則程序集的數據還會保留在內存中,直至整個進程關閉。除了關閉整個進程,沒有機制可以卸載這類程序集。由于一個進程中允許包含多個域,某個域可以在不停止整個進程的情況下卸載。以這樣的方式卸載不再需要的代碼,可以減少內存占用并極大提高應用程序的可縮放性。此外,由于線程并不與域一一對應,當域中存在活動線程時,調用AppDomain.Unload方法可能無法將域卸載并導致異常。


在域中加載程序集
從上面的論述不難看出:要運行應用程序,必須首先將程序集(.Net下經編譯產生,包含IL中間語言、元數據及清單等)加載到域中。而且一個域中可裝載多個程序集。默認情況下,公共語言運行庫自動將一個程序集加載到包含引用該程序集的代碼的域。通過此方法,該程序集的代碼和數據獨立于使用該程序集的應用程序。

自行創建域的好處之一便是可以指定如何裝載程序集。在域中有以下兩種方式加載程序集:

1、將當前程序集加載入單獨的域中,同一個程序集可能有多個副本;

2、以非特定于域的形式加載程序集,讓一個程序集在多個域間共享;

這兩種方式各自偏重于安全性和性能,需要視具體情況在二者之間權衡。具體地,在 .Net 框架中,System.Reflection.Assembly 類提供以下靜態方法將程序集加載至域:

· Load()在給頂程序集名稱的前提下,加載該程序集:     Assembly SampleAssembly;

SampleAssembly = Assembly.Load("System.Data");//根據類型加載程序集
· LoadFrom()在已知程序集文件名或路徑等信息的情況下加載程序集:    Assembly SampleAssembly;

SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");//根據已有程序集名稱加載
參考資料:

《Microsoft .NET Framework程序設計》
《.NET Framework高級編程》
《.NET框架精髓 》等

posted on 2006-04-19 12:27 夢在天涯 閱讀(859) 評論(0)  編輯 收藏 引用 所屬分類: C#/.NET

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812978
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧美一区二区原创| 欧美在线免费观看视频| 欧美一区成人| 国产精品普通话对白| 一区二区三区久久久| 一区二区欧美日韩视频| 欧美视频观看一区| 亚洲图色在线| 欧美一级欧美一级在线播放| 欧美在线黄色| 国内精品一区二区三区| 久久精品日产第一区二区三区| 亚洲欧美精品一区| 国产亚洲精品福利| 免费在线观看一区二区| 欧美一级欧美一级在线播放| 亚洲大胆av| 亚洲精品在线视频观看| 国产美女搞久久| 亚洲精美视频| 亚洲区一区二| 欧美日韩国产一区二区三区地区| 99精品国产热久久91蜜凸| 亚洲深夜激情| 亚洲天堂成人| 国产日韩精品久久久| 久久久久久久999| 欧美成人中文字幕| 99国产精品| 久久九九精品99国产精品| 亚洲国产一区二区在线| 国产精品99久久久久久白浆小说 | 亚洲女爱视频在线| 欧美资源在线观看| 夜夜嗨网站十八久久| 亚洲一区二区三区精品视频| 国产精品日韩精品欧美精品| 久久久久久一区二区| 暖暖成人免费视频| 亚洲欧美综合| 欧美日韩国产免费| 久久综合狠狠综合久久综合88| 欧美电影电视剧在线观看| 久久精品视频免费观看| 欧美伦理在线观看| 久久久久一区二区| 国产精品视频免费观看www| 免费视频亚洲| 国产日韩欧美精品一区| 美女黄色成人网| 国产精品区一区| 亚洲人成亚洲人成在线观看图片| 亚洲视频每日更新| 亚洲欧美国产高清va在线播| 久久亚洲免费| 亚洲肉体裸体xxxx137| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲视频一区二区| 久久久五月天| 欧美与欧洲交xxxx免费观看| 欧美激情精品久久久六区热门| 免费人成精品欧美精品| 国产热re99久久6国产精品| 亚洲精品色婷婷福利天堂| 国产精品v日韩精品v欧美精品网站| 欧美高清不卡| 亚洲第一在线综合在线| 亚洲精选一区二区| 亚洲一区二区精品在线观看| 欧美激情一区二区三区四区| 欧美 日韩 国产精品免费观看| 国产一区二区三区四区五区美女| 亚洲你懂的在线视频| 亚洲影院一区| 国产麻豆日韩| 性欧美video另类hd性玩具| 亚洲欧美视频一区二区三区| 91久久国产综合久久| 久久精品亚洲一区| 久久九九全国免费精品观看| 国产精品乱看| 99国产精品视频免费观看| 亚洲精品久久7777| 欧美高清日韩| 亚洲一区二区精品视频| 国产精品视频免费| 亚洲欧美日韩成人| 久久久久久久久久看片| 影音先锋在线一区| 欧美激情视频在线播放| 日韩网站在线观看| 日韩亚洲不卡在线| 裸体女人亚洲精品一区| 91久久国产精品91久久性色| 国产精品99久久久久久白浆小说| 欧美日韩中字| 亚洲精品综合精品自拍| 欧美亚洲专区| 在线免费观看日本欧美| 免费亚洲电影| 午夜在线不卡| 欧美激情亚洲| 亚洲永久精品大片| 在线播放一区| 免费不卡在线观看| 一区二区欧美激情| 羞羞漫画18久久大片| 亚洲韩国青草视频| 欧美四级电影网站| 欧美一级久久久| av不卡在线观看| 久久综合久久综合九色| 亚洲最快最全在线视频| 黄色亚洲精品| 欧美日韩日日夜夜| 久久九九久久九九| 亚洲欧美在线免费| 亚洲国产精品久久久久婷婷884 | 国产亚洲欧美一区二区| 欧美成人一二三| 久久精品伊人| 亚洲欧美在线观看| 亚洲一区二区三区精品视频 | 中文精品视频| 亚洲三级电影在线观看| 在线看成人片| 国产一区二区激情| 国产精品乱人伦一区二区| 欧美激情精品久久久久久黑人| 久久久久久久久久久久久9999| 亚洲一区国产一区| 在线亚洲一区二区| 一区二区免费在线播放| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲精品国产无天堂网2021| 国语自产精品视频在线看8查询8| 欧美四级在线观看| 欧美日韩成人网| 欧美理论电影网| 欧美美女视频| 欧美日韩国产三区| 欧美日韩中文字幕在线| 欧美视频在线观看一区| 欧美日韩精品一本二本三本| 欧美日韩国产美| 国产精品s色| 亚洲无限av看| 午夜免费日韩视频| 欧美一级视频| 久久免费视频网站| 欧美一区二区在线免费观看| 久久精品久久综合| 久久精品卡一| 玖玖视频精品| 欧美激情按摩在线| 亚洲日本aⅴ片在线观看香蕉| 最新国产乱人伦偷精品免费网站| 亚洲国产高清一区二区三区| 亚洲三级视频| 亚洲一区二区三区精品在线观看 | 久久久久久久久久久成人| 久久久www成人免费无遮挡大片| 久久精品30| 欧美福利在线观看| 国产精品成人一区二区三区夜夜夜| 国产精品v欧美精品v日韩| 国产亚洲视频在线| 亚洲七七久久综合桃花剧情介绍| 99视频精品在线| 性色av一区二区怡红| 欧美国产视频日韩| 在线天堂一区av电影| 香蕉视频成人在线观看 | 午夜精品免费在线| 麻豆精品网站| 国产精品女同互慰在线看| 精品动漫一区| 亚洲淫片在线视频| 免费欧美电影| 亚洲一区二区三区在线视频| 久久久久国产一区二区三区四区| 欧美噜噜久久久xxx| 国内精品视频666| 一区二区日韩欧美| 鲁大师成人一区二区三区| 亚洲国产欧美一区二区三区同亚洲| 一二三四社区欧美黄| 鲁大师成人一区二区三区 | 欧美77777| 国产日韩欧美精品在线| 99热这里只有精品8| 久久久一区二区三区| 一区二区三区高清不卡| 六月天综合网| 国产日韩欧美在线看| 一区二区三区四区五区视频 | 久久久久久久久久久久久久一区| 91久久久精品| 久久日韩粉嫩一区二区三区| 国产精品日韩欧美一区二区三区|