.net AppDomain

ForTechnology發表於2011-12-01
應用程式域(由 AppDomain 物件表示)為執行託管程式碼提供隔離、解除安裝和安全邊界。
•    使用應用程式域隔離可能終止程式的任務。 如果正在執行任務的 AppDomain 的狀態變得不穩定,則可以解除安裝 AppDomain,但不會影響程式。 當程式必須不重新啟動而長時間執行時,這一點很重要。 還可使用應用程式域隔離不應共享資料的任務。
•    如果程式集被載入到預設應用程式域中,則當程式執行時將無法從記憶體中解除安裝該程式集。 但是,如果開啟另一個應用程式域來載入和執行程式集,則解除安裝該應用程式域時也會同時解除安裝程式集。 使用此技術最小化長時間執行的程式的工作集,這些程式偶爾會使用大型 DLL。
多個應用程式域可以在一個程式中執行;但是,在應用程式域和執行緒之間沒有一對一的關聯。 多個執行緒可以屬於一個應用程式域,儘管給定的執行緒並不侷限於一個應用程式域,但在任何給定時間,執行緒都在一個應用程式域中執行。
使用 CreateDomain 方法建立應用程式域。 AppDomain 例項用於載入和執行程式集 (Assembly)。 當不再使用 AppDomain 時,可以將它解除安裝。
AppDomain 類實現一組事件,這些事件使應用程式可以在載入程式集、要解除安裝應用程式域或引發未經處理的異常時進行響應。
有關使用應用程式域的更多資訊,請參見 應用程式域。
此類實現 MarshalByRefObject、_AppDomain 和 IEvidenceFactory 介面。
在任何情況下都不應建立 AppDomain 物件的可遠端控制的包裝。 這樣做可釋出對該 AppDomain 的遠端引用,將諸如 CreateInstance 方法向遠端訪問公開,並有效損壞該 AppDomain 的程式碼訪問安全性。 連線到遠端 AppDomain 的惡意客戶端可以獲得對 AppDomain 本身可訪問的所有資源的訪問權。 您不應為任何以下型別建立可遠端控制的包裝:擴充套件 MarshalByRefObject 的型別和實現惡意客戶端可用來繞過安全系統的方法的型別。
當在Windows中啟動Notepad程式時,眾所周知程式會執行一個包含在容器內的程式。可以啟動多個Notepad的例項,並且每個例項都會在一個專注的進行程執行。使用工作管理員,可以看到在系統中當前執行的所有程式的清單。

  一個程式包括可執行從作業系統中保留的在記憶體中的程式碼和程式資料。在程式之內只少有一個包含在程式之內的正在執行指令的執行緒,並且在多數情況下有多個執行緒。如果程式開啟了任何檔案或者資源,這些資源將屬於這個程式。

  一個程式也有一個分界線。包含在程式之內的錯誤程式碼不能在當前程式之外的地區腐化。在一個程式之內很容易通訊,但是專業技術要求一個程式對另一個程式通訊是必需的。每一個程式也在一個特殊的上下文安全系統中執行,這個安全系統規定在機器和網路中程式做什麼。

  一個程式是一個在Windows   作業系統中獨立執行的最小單位。這會給在一個單一伺服器上對一大堆應用程式的ISP提出一個問題。ISP將會分離每一個在同一個伺服器上的與另一個公司的應用程式干擾的ASP.NET應用程式。但是相關的發射和執行一個對成百上千的應用程式的過程成本禁止的。

  介紹應用程式域

  .NET介紹一個應用程式域的概念,或者AppDomain像一個過程,AppDomain是既是容器又是邊界線。.NET執行時間使用   AppDomain作為程式碼和資料的容器,就像作業系統一個過程作為程式碼和資料的容器一樣。當作業系統使用一個過程來分離不整齊的程式碼時,.NET執行時間使用一個AppDomain來分離在一個安全邊線內的程式碼。

  一個AppDomain僅僅屬於一個單過程,但是單個過程能夠保持多重的AppDomain。一個Appdomain建立起來相對容易(與一個過程比較起來),並且與一個過程比較起來具有少的維護費用。由於這些原因,一個AppDomain是ISP(提供成千上萬的應用程式)的很好的解決方案。每一個應用程式可以生存在一個獨立的AppDomain之內,並且許多這樣的AppDomain可以生存於一個單一的過程(節省費用)之內。

  AppDomain

  在同伺服器上建立了兩個ASP.NET應用程式,並且沒有任何特殊配置。會發生什麼事情呢?

  一個單一的ASP.NET手工程式使ASP.NET應用程式變成兩方面的主要程式。在Windows   XP和Windows   2000中,這一程式被命名為aspnet_wp.exe,並且這一程式執行在本地的ASPNET計數器的前後安全關係中。在Windows   2003手工程式擁有w3wp.exe並且預設執行在NETWOR   SERVICE中。

  一個對旬可以進住在一個AppDomain中。每一個ASP.NET應用程式將具有它自己的一套全域性變數:Cache,   Application進住進同一程式,.NET   AppDomain是一個獨立的單元。如果存有共享的或靜態成員的類,並且那些類存在於兩種應用程式之內,每一個AppDomain擁有它自己的靜態欄位的備份—資料並不共享。每一個應用程式的資料和程式碼安全獨立存在並且在一邊界之內由AppDomain提供。

  為了在AppDomain之間通訊或者在AppDomain之間交換物件,需要檢視在.NET中穿過邊界的通訊技術,例如.NET細微的或Web   服務。

  對將AppDomain作為邊界思想的警告之一是ASP.NET應用程式在預設情況下會帶著充分的信任執行。充分信任的程式碼可以執行原生程式碼,並且原生程式碼可以本質地在程式之內的任何內容。需要執行帶著部分信任執行應用程式來約束存取不完整的程式碼並且對安全的AppDomain驗證所有程式碼。

  隱藏備份並且重新啟動

  一旦一個集合載入到一個AppDomain,沒有辦法從AppDomain集合的辦法。不過,從一個程式中移除一個AppDomain是有可能的。

  如果將一個已更新的dll複製到一個應用程式的子目錄中,從ASP.NET的執行時間知道有新程式碼要執行。既然ASP.NET不能將dll複製到已存在的AppDomain中,它就會起動一個新AppDomain。舊的應用程式域是“排水已停止”,那就是,存在的需要被允許完成執行並且一旦它們執行完成AppDomain可以解除安裝。帶有新程式碼的新的AppDomain就會開始並且開始所有的新請求。

  典型地說,當一個dll載入進一個程式時,程式對dll加鎖並且不能對磁碟的上的檔案進行覆蓋。不過,AppDomain有一個眾所周知的特點:隱藏複製那所有的允許保留在磁碟上的那些未被加鎖的可替換的集合。

  執行時間對二進位制子目錄的帶有Shadow   Copy的ASP.NET進行初始化。AppDomain將任何的加鎖之前的dll從二進位制子目錄中拷貝到一個臨時位置並且再將這些dll載入到記憶體。   Shadow   Copy允許沒有將網頁線上的情況下對所有在二進位制子目錄中的任何dll進行重寫。

  熟練掌握Domain

  應用程式域替換OS程式將為單獨的.NET結點單元。一個可理解的應用程式域將會給你一個在ASP.NET應用程式後的手工發生的概念。使用   AppDomain類的CurrentDomain屬性,可以檢查關於程式碼正在執行的AppDomain的屬性,包括我們在此文章中討論的Shadow   Copy。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-712501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章