使用應用程式域程式設計

2021-04-18 01:36:00 字數 3266 閱讀 9121

以前使用程序邊界來隔離在同一臺計算機上執行的應用程式。每乙個應用程式被載入到單獨的程序中,這樣就將該應用程式與在同一臺計算機上執行的其他應用程式相隔離。

隔離這些應用程式的原因在於記憶體位址是與程序相關的;在目標程序中,不能通過任何有意義的方式使用從乙個程序傳遞到另乙個程序的記憶體指標。此外,您不能在兩個程序間進行直接呼叫。您必須代之以使用**,它提供一定程度的間接性。

託管**必須先通過乙個驗證過程,然後才能執行(除非管理員已授權跳過該驗證)。此驗證過程將驗證以下內容:這些**是否會嘗試訪問無效的記憶體位址?是否會嘗試執行某些導致程序(該**執行時所在的程序)無法正常進行的其他操作?通過此驗證測試的**將被認為是型別安全的。由於公共語言執行庫能夠驗證**是否為型別安全的**,所以它可以提供與程序邊界一樣大的隔離級別,而其效能開銷則要低得多。

應用程式域提供安全而通用的處理單元,公共語言執行庫可使用它來提**用程式之間的隔離。您可以在具有同等隔離級別(存在於單獨的程序中)的單個程序中執行幾個應用程式域,而不會造成程序間呼叫或程序間切換等方面的額外開銷。在乙個程序內執行多個應用程式的能力顯著增強了伺服器的可伸縮性。

隔離應用程式對於應用程式安全也是十分重要的。例如,您可以在單個瀏覽器程序中執行幾個 web 應用程式中的控制項,同時使這些控制項不能訪問彼此的資料和資源。

應用程式域所提供的隔離具有以下優點:

在乙個應用程式中出現的錯誤不會影響其他應用程式。因為型別安全的**不會導致記憶體錯誤,所以使用應用程式域可以確保在乙個域中執行的**不會影響程序中的其他應用程式。

能夠在不停止整個程序的情況下停止單個應用程式。使用應用程式域使您可以解除安裝在單個應用程式中執行的**。

注意 不能解除安裝單個程式集或型別。只能解除安裝整個域。

在乙個應用程式中執行的**不能直接訪問其他應用程式中的**或資源。為了強制實施此隔離,公共語言執行庫禁止在不同應用程式域中的物件之間進行直接呼叫。要在各域之間傳遞物件,可以複製這些物件,或通過**訪問這些物件。如果複製物件,那麼對該物件的呼叫為本地呼叫。也就是說,呼叫方和被引用的物件位於同一應用程式域中。如果通過**訪問物件,那麼對該物件的呼叫為遠端呼叫。在此情況下,呼叫方和被引用的物件位於不同的應用程式域中。域間呼叫所採用的遠端呼叫結構與兩個程序間的呼叫或兩台計算機間的呼叫結構相同。

**行為的作用範圍由它執行所在的應用程式決定。換言之,應用程式域將提**用程式版本策略等配置設定、它所訪問的任意遠端程式集的位置,以及載入到該域中的程式集的位置資訊。

應用程式域為公共語言執行庫提供隔離單元。它們在程序中建立和執行。應用程式域通常由執行庫宿主建立,執行庫宿主是負責將執行庫載入程序並在應用程式域中執行使用者**的應用程式。

執行庫宿主建立程序和預設應用程式域,並在其中執行託管**。

執行庫宿主包括 asp.net、microsoft internet explorer 和 windows 外殼程式。

對於多數應用程式,您不需要建立自己的應用程式域,執行庫宿主將為您建立所有必要的應用程式域。

但是,如果您的應用程式需要隔離**或使用並解除安裝 dll,您可以建立並配置其他應用程式域。

1、建立應用程式域

當需要應用程式域時,公共語言執行庫宿主會自動建立它們。不過,您可以建立自己的應用程式域並將它們載入到需要親自管理的程式集中。您也可以建立從中執行**的應用程式域。

2、解除安裝應用程式域

3、配置應用程式域

4、從應用程式域中檢索安裝程式資訊

5、影像複製程式集

用於應用程式域中的程式集通過影像複製可以在不解除安裝應用程式域的情況下進行更新。這對必須不間斷使用的應用程式(如 asp.net **)尤為有用。

引導程式集時,公共語言執行庫會將程式集檔案鎖定,因此只有解除安裝了程式集之後才能更新該檔案。從應用程式域解除安裝程式集的唯一方法是解除安裝該應用程式域,因此在正常情況下,只有解除安裝了使用程式集的所有應用程式域之後才能在磁碟上更新程式集。

將應用程式域配置為影像複製檔案時,來自應用程式路徑的程式集被複製到另乙個位置並從該位置進行載入。該副本被鎖定,但原始程式集檔案將取消鎖定並可以進行更新。

部分公共屬性

名稱              說明

activationcontext      獲取當前應用程式域的啟用上下文。

basedirectory         獲取基目錄,它由程式集衝突解決程式用來探測程式集。

currentdomain         獲取當前 thread 的當前應用程式域。

domainmanager         獲得初始化應用程式域時主機提供的域管理器。

dynamicdirectory     獲取目錄,它由程式集衝突解決程式用來探測動態建立的程式集。

evidence         獲取與此應用程式域相關聯的 evidence,它用作安全策略的輸入。

friendlyname         獲取此應用程式域的友好名稱。

id             獲得乙個整數,該整數唯一標識程序中的應用程式域。

relativesearchpath     獲取相對於基目錄的路徑,在此程式集衝突解決程式應探測專用程式集。

setupinformation     獲取此例項的應用程式域配置資訊。

shadowcopyfiles     獲取乙個指示值,它表明載入到應用程式域中的所有程式集是否為影像複製的。

部分公共方法

名稱              說明

createdomain          建立新的應用程式域。

createinstance      建立在指定程式集中定義的指定型別的新例項

createinstancefrom      建立在指定程式集檔案中定義的指定型別的新例項。

createobjref           建立乙個物件,該物件包含生成用於與遠端物件進行通訊的**所需的全部相關資訊。

executeassembly      執行指定檔案中包含的程式集。

unload          解除安裝指定的應用程式域。

公共事件

名稱              說明

assemblyload          在引導程式集時發生。

assemblyresolve     在對程式集的解析失敗時發生。

proces***it         當預設應用程式域的父程序存在時發生。

reflectiononlyassemblyresolve     當程式集的解析在只反射上下文中失敗時發生。

resourceresolve     當資源解析因資源不是程式集中的有效鏈結資源或嵌入資源而失敗時發生。

typeresolve         在對型別的解析失敗時發生。

unhandledexception     當某個異常未**獲時出現。

應用程式域

一種邊界,它由公共語言執行庫圍繞同一應用程式範圍內建立的物件建立 即,從應用程式入口點開始,沿著物件啟用的序列的任何位置 應用程式域有助於將在乙個應用程式中建立的物件與在其他應用程式中建立的物件隔離,以使執行時行為可以預知。在乙個單獨的程序中可以存在多個應用程式域。以前使用程序邊界來隔離在同一臺計算...

應用程式域

一種邊界,它由公共語言執行庫圍繞同一應用程式範圍內建立的物件建立 即,從應用程式入口點開始,沿著物件啟用的序列的任何位置 應用程式域有助於將在乙個應用程式中建立的物件與在其他應用程式中建立的物件隔離,以使執行時行為可以預知。在乙個單獨的程序中可以存在多個應用程式域。以前使用程序邊界來隔離在同一臺計算...

應用程式域

一種邊界,它由公共語言執行庫圍繞同一應用程式範圍內建立的物件建立 即,從應用程式入口點開始,沿著物件啟用的序列的任何位置 應用程式域有助於將在乙個應用程式中建立的物件與在其他應用程式中建立的物件隔離,以使執行時行為可以預知。在乙個單獨的程序中可以存在多個應用程式域。以前使用程序邊界來隔離在同一臺計算...