應用程序域

應用程序域

應用程序域 (application domain) (AppDomain) 一種邊界,它由公共語言運行庫圍繞同一應用程序範圍內創建的對象建立(即,從應用程序入口點開始,沿著對象激活的序列的任何位置)。應用程序域有助於將在一個應用程序中創建的對象與在其他應用程序中創建的對象隔離,以使運行時行為可以預知。在一個單獨的進程中可以存在多個應用程序域。

簡介


以前使用進程邊界來隔離在同一台計算機上運行的應用程序。每一個應用程序被載入到單獨的進程中,這樣就將該應用程序與在同一台計算機上運行的其他應用程序相隔離。
隔離這些應用程序的原因在於內存地址是與進程相關的;在目標進程中,不能通過任何有意義的方式使用從一個進程傳遞到另一個進程的內存指針。此外,您不能在兩個進程間進行直接調用。您必須代之以使用代理,它提供一定程度的間接性。

託管代碼


託管代碼必須先通過一個驗證過程,然後才能運行(除非管理員已授權跳過該驗證)。此驗證過程將驗證以下內容:這些代碼是否會嘗試訪問無效的內存地址?是否會嘗試執行某些導致進程(該代碼運行時所在的進程)無法正常進行的其他操作?通過此驗證測試的代碼將被認為是類型安全的。由於公共語言運行庫能夠驗證代碼是否為類型安全的代碼,所以它可以提供與進程邊界一樣大的隔離級別,而其性能開銷則要低得多。
應用程序域提供安全而通用的處理單元,公共語言運行庫可使用它來提供應用程序之間的隔離。您可以在具有同等隔離級別(存在於單獨的進程中)的單個進程中運行幾個應用程序域,而不會造成進程間調用或進程間切換等方面的額外開銷。在一個進程內運行多個應用程序的能力顯著增強了伺服器的可伸縮性。

隔離應用程序


隔離應用程序對於應用程序安全也是十分重要的。例如,您可以在單個瀏覽器進程中運行幾個 Web 應用程序中的控制項,同時使這些控制項不能訪問彼此的數據和資源。
應用程序域所提供的隔離具有以下優點:
在一個應用程序中出現的錯誤不會影響其他應用程序。因為類型安全的代碼不會導致內存錯誤,所以使用應用程序域可以確保在一個域中運行的代碼不會影響進程中的其他應用程序。
能夠在不停止整個進程的情況下停止單個應用程序。使用應用程序域使您可以卸載在單個應用程序中運行的代碼。
注意 不能卸載單個程序集或類型。只能卸載整個域。

隔離


在一個應用程序中運行的代碼不能直接訪問其他應用程序中的代碼或資源。為了強制實施此隔離,公共語言運行庫禁止在不同應用程序域中的對象之間進行直接調用。要在各域之間傳遞對象,可以複製這些對象,或通過代理訪問這些對象。如果複製對象,那麼對該對象的調用為本地調用。也就是說,調用方和被引用的對象位於同一應用程序域中。如果通過代理訪問對象,那麼對該對象的調用為遠程調用。在此情況下,調用方和被引用的對象位於不同的應用程序域中。域間調用所採用的遠程調用結構與兩個進程間的調用或兩台計算機間的調用結構相同。
代碼行為的作用範圍由它運行所在的應用程序決定。換言之,應用程序域將提供應用程序版本策略等配置設置、它所訪問的任意遠程程序集的位置,以及載入到該域中的程序集的位置信息。
向代碼授予的許可權可以由代碼運行所在的應用程序域來控制。