應用程式定義域和程式集

來源:互聯網
上載者:User

本主題描述應用程式定義域和程式集之間的關係。您必須首先將一個程式集載入到應用程式定義域中,然後才能運行該應用程式。運行普通的應用程式會導致將幾個程式集載入到一個應用程式定義域中。預設情況下,公用語言運行庫將一個程式集載入到包含引用該程式集的代碼的應用程式定義域。通過此方法,該程式集的代碼和資料獨立於使用該程式集的應用程式。   
   如果程式集由一個進程中的多個域使用,則該程式集的代碼(而非資料)可以由引用該程式集的所有域來共用。這將降低運行時所使用的記憶體量。這種共用組件代碼的方法類似於    Microsoft    Win32    API    LoadLibrary    在引用同一    DLL    的進程之間共用字碼頁的方法。當一個程式集的代碼可以由進程中的所有域共用時,可以認為該程式集是非特定於域的。運行庫宿主決定在將運行庫載入到進程中時是否以非特定於域的形式載入程式集。有關更多資訊,請參見    CorBindToRuntimeEx    文檔;在    .NET    Framework    SDK    的公用語言運行庫宿主介面規範中可以找到該文檔。   
   有三個選項用於載入非特定於域的程式集:     
   不以非特定於域的形式載入任何程式集(Mscorlib    除外,它始終以非特定於域的形式載入)。此設定稱作單域,因為它通常用在宿主只運行進程中的單個應用程式時。     
   以非特定於域的形式載入所有程式集。此設定用於以下情況:進程中有多個應用程式定義域,所有這些應用程式定義域均運行相同的代碼。     
   以非特定於域的形式載入具有強式名稱的程式集。當在同一進程中運行多個應用程式時使用此設定。     
   當您決定是否以非特定於域的形式載入程式集時,必須在減少記憶體佔用和降低效能之間加以權衡。如果程式集包含被頻繁訪問的待用資料或靜態方法,則非特定於域的程式集的執行速度會較慢。對待用資料或靜態方法的訪問較慢的原因在於需要隔離應用程式。訪問該程式集的每一應用程式定義域都必須具有待用資料或靜態方法的單獨副本,以避免跨域邊界引用靜態變數中的對象。因此,運行庫包含附加的邏輯,用以將調用方引導到待用資料或靜態方法的適當副本。這一額外的邏輯將降低調用速度。   
   如果在每個域中向一個程式集授予一組不同的許可權,該程式集將不在各域間共用。當運行庫宿主設定了應用程式定義域層級的安全性原則時,就可能發生此情況。如果向程式集授與權限組在每個域中都是不同的,則不應以非特定於域的形式載入程式集。  

程式集是    .NET    Framework    編程的基本組成部分。程式集執行以下功能:    

無論怎樣試圖避免與共用組件打交道,仍然會遇到需要在多個應用程式之間共用組件的情況。共用組件與私用組件主要存在兩方面的區別位置和標識。私用組件必須為於應用程式所在目錄或子目錄中,而共用組件安裝在被稱為全域組件快取(Global Assembly Cache,GAC)的一個特定的全域緩衝中。在Windows作業系統中,GAC位於Windows系統目錄下的Assembly目錄中(例如:C:\WinNT\Assembly)。

雖然共用組件易記名稱與私用組件一樣,但是.NET運行庫通過強名(strong name)(也稱共用名稱:shared name)來標識共用組件。一個強式名稱由易記名稱(如MathLibrary)、地區資訊(如:英語)、版本號碼(如1.2.0.0)、公開金鑰(public key)和數位簽章等組成。這裡,需要強式名稱提供的嚴格認證等級,因為:

●       希望本公司開發的程式集具有唯一的名稱,且不會被其他公司複製。

●       希望針對不同的實現方式或不同的地區資訊,能夠共用多個不同版本的程式集。

●       防止駭客的“特洛伊木馬”程式集替代合法程式集,利用有效存取權限對系統進行嚴重破壞。

為了更為清楚地說明這些問題,下面舉例說明MathLibrary程式集轉換成共用組件的步驟。

1.4.1   私用組件
私用組件是最簡單的一種程式集類型。私用組件一般附帶在某些軟體上,且只能用於該軟體中。附帶私用組件的常見情況是,以可執行檔或許多庫的方式提供應用程式,這些庫包含的代碼只能用於該應用程式。

系統可以保證私用組件不被其他軟體使用,因為應用程式只能載入位於主執行檔案所在檔案夾或其子檔案夾中的程式集

使用者一般會希望把商用軟體安裝在它自己的目錄下,這樣軟體包沒有覆蓋、修改或載入另一個軟體包的私用組件的風險。私用組件只能用於自己的軟體包,這樣,使用者對什麼軟體使用它們就有了更多的控制。因此,不需要採取安全措施,因為這沒有其他商用軟體用某個新版本的程式集覆蓋原來的私用組件的風險(但軟體是專門執行懷有惡意的損害性操作的情況除外)。名稱也不會有衝突。如果私用組件中的類正巧與另一個人的私用組件中的類同名,是不會有問題的,因為給定的應用程式只能使用私用組件的名稱。

因為私用組件完全是自含式的,所以安裝它的過程就很簡單。只需把相應的檔案放在檔案系統的對應檔案夾中即可(不需要登錄機碼),這個過程稱為“0影響(xcopy)安裝”。

1.4.2   共用組件
共用組件是其他應用程式可以使用的公用庫。因為其他軟體可以訪問共用組件,所以需要採取一定的保護措施來防止以下風險:

●        名稱衝突,另一個公司的共用組件執行的類型與自己的共用組件中的類型同名。因為客戶機代碼理論上可以同時訪問這些程式集,所以這是一個嚴重的問題。

●        程式集被同一個程式集的不同版本覆蓋——新版本與某些已有的客戶機代碼不相容。

這些問題的解決方案是把共用組件放在檔案系統的一個特定的子目錄樹中,稱為全域程式集快取(GAC)。與私用組件不同,不能簡單地把共用組件複製到對應的檔案夾中,而需要專門安裝到快取中,這個過程可以用許多.NET工具來完成,其中包含對程式集的檢查、在程式集快取中設定一個小的資料夾階層,以確保程式集的完整性。

為了避免名稱衝突,共用組件應根據私人祕密金鑰加密法指定一個名稱(私用組件只需要指定與其主檔案名相同的名稱即可)。該名稱稱為強名(strong name),並保證其惟一性,它必須由要引用共用組件的應用程式來引用。

與覆蓋程式集相關的問題,可以通過在資訊清單中指定版本資訊來解決,也可以通過同時安裝來解決。

   包含公用語言運行庫執行的代碼。如果可移植可執行    (PE)    檔案沒有相關聯的資訊清單,則將不執行該檔案中的    Microsoft    中繼語言    (MSIL)    代碼。請注意,每個程式集只能有一個進入點(即    DllMain、WinMain    或    Main)。     
   程式集形成安全邊界。程式集就是在其中請求和授予許可權的單元。有關應用於程式集的安全邊界的更多資訊,請參見程式集安全注意事項。     
   程式集形成類型邊界。每一類型的標識均包括該類型所駐留的程式集的名稱。在一個程式集範圍內載入的    MyType    類型不同於在其他程式集範圍內載入的    MyType    類型。     
   程式集形成引用範圍邊界。程式集的清單包含用於解析類型和滿足資源請求的組件中繼資料。它指定在該程式集之外公開的類型和資源。該清單還枚舉它所依賴的其他程式集。     
   程式集形成版本邊界。程式集是公用語言運行庫中最小的可版本化單元,同一程式集中的所有類型和資源均會被版本化為一個單元。程式集的清單描述您為任何依賴項程式集所指定的版本依賴性。有關版本控制的更多資訊,請參見程式集版本控制。     
   程式集形成部署單元。當一個應用程式啟動時,只有該應用程式最初調用的程式集必須存在。其他程式集(例如本地化資源和包含工具 + 生產力類的程式集)可以按需檢索。這就使應用程式在第一次下載時保持精簡。有關部署程式集的更多資訊,請參見部署應用程式。     
   程式集是支援並存執行的單元。有關運行多個程式集版本的更多資訊,請參見程式集和並行    (side-by-side)    執行。     
   程式集可以是靜態或動態。靜態程式集可以包括    .NET    Framework    類型(介面和類),以及該程式集的資源(位元影像、JPEG    檔案、資源檔等)。靜態程式集儲存在磁碟上的可移植可執行    (PE)    檔案中。您還可以使用    .NET    Framework    來建立動態程式集,動態程式集直接從記憶體運行並且在執行前不儲存到磁碟上。您可以在執行動態程式集後將它們儲存在磁碟上。   
   有幾種建立程式集的方法。您可以使用過去用來建立    .dll    或    .exe    檔案的開發工具,例如    Visual    Studio    .NET。您可以使用在    .NET    Framework    SDK    中提供的工具來建立帶有在其他開發環境中建立的模組的程式集。您還可以使用公用語言運行庫    API(例如    Reflection.Emit)來建立動態程式集。

應用程式定義域概述   
   以前使用進程邊界來隔離在同一台電腦上啟動並執行應用程式。每一個應用程式被載入到單獨的進程中,這樣就將該應用程式與在同一台電腦上啟動並執行其他應用程式相隔離。   
   隔離這些應用程式的原因在於記憶體位址是與進程相關的;在目標進程中,不能通過任何有意義的方式使用從一個進程傳遞到另一個進程的記憶體指標。此外,您不能在兩個進程間進行直接調用。您必須代之以使用代理,它提供一定程度的間接性。   
   Managed 程式碼必須先通過一個驗證過程,然後才能運行(除非管理員已授權跳過該驗證)。此驗證過程將驗證以下內容:這些代碼是否會嘗試訪問無效的記憶體位址?是否會嘗試執行某些導致進程(該代碼運行時所在的進程)無法正常進行的其他動作?通過此驗證測試的代碼將被認為是型別安全的。由於公用語言運行庫能夠驗證代碼是否為型別安全的代碼,所以它可以提供與進程邊界一樣大的隔離等級,而其效能開銷則要低得多。   
   應用程式定義域提供了一個更安全、用途更廣的處理單元,公用語言運行庫可使用該單元提供應用程式之間的隔離。您可以在具有同等隔離等級(存在於單獨的進程中)的單個進程中運行幾個應用程式定義域,而不會造成進程間調用或進程間切換等方面的額外開銷。在一個進程內運行多個應用程式的能力顯著增強了伺服器的延展性。   
   隔離應用程式對於應用程式安全也是十分重要的。例如,您可以在單個瀏覽器進程中運行幾個    Web    應用程式中的控制項,同時使這些控制項不能訪問彼此的資料和資源。   
   應用程式定義域所提供的隔離具有以下優點:     
   在一個應用程式中出現的錯誤不會影響其他應用程式。因為型別安全的代碼不會導致記憶體錯誤,所以使用應用程式定義域可以確保在一個域中啟動並執行代碼不會影響進程中的其他應用程式。     
   能夠在不停止整個進程的情況下停止單個應用程式。使用應用程式定義域使您可以卸載在單個應用程式中啟動並執行代碼。     
   注意       不能卸載單個程式集或類型。只能卸載整個域。   
   在一個應用程式中啟動並執行代碼不能直接存取其他應用程式中的代碼或資源。為了強制實施此隔離,公用語言運行庫禁止在不同應用程式定義域中的對象之間進行直接調用。要在各域之間傳遞對象,可以複製這些對象,或通過代理訪問這些對象。如果複製對象,那麼對該對象的調用為本地調用。也就是說,調用方和被引用的對象位於同一應用程式定義域中。如果通過代理訪問對象,那麼對該對象的調用為遠程調用。在此情況下,調用方和被引用的對象位於不同的應用程式定義域中。域間調用所採用的遠程調用結構與兩個進程間的調用或兩台電腦間的調用結構相同。因此,被引用的對象的中繼資料必須對於兩個應用程式定義域均可用,以便用    JIT    正確編譯該方法調用。如果調用域無法訪問被調用對象的中繼資料,則編譯可能會失敗,引發    System.IO.FileNotFound    類型的異常。有關詳細資料,請參見使用    .NET    遠端訪問其他應用程式定義域中的對象。確定如何跨域訪問對象的機制是由該對象決定的。有關更多資訊,請參見    MarshalByRefObject    類。     
   程式碼為的作用範圍由它運行所在的應用程式決定。換言之,應用程式定義域將提供應用程式版本原則等配置設定、它所訪問的任意遠程程式集的位置,以及載入到該域中的程式集的位置資訊。     
   向代碼授與權限可以由代碼運行所在的應用程式定義域來控制。    

MetaData意思是中繼資料,也稱之為資料的資料。

資料的資料?

一個資料存放區在共用卷裡時,我們可以直接看到它是一個文檔、或圖片、或視頻、或資料庫檔案,這些都是資料本身。然而在儲存該資料時,檔案系統還會產生很多無法直接看到的,與該資料有關的資料,如檔案系統中檔案檢索表,路徑資訊、地址資訊等,而這些資料就稱之為文檔、圖片、視頻等在共用卷中的中繼資料。

SAN網路儲存共用軟體管理的主要內容就是中繼資料,控制中繼資料在多主機之間的傳輸。

我們可以在很多地方看到中繼資料的儲存,網上DOWN下來的電影本身一個視頻檔案資料,而點擊右鍵查到看的視頻檔案屬性,如儲存路徑、碼率、檔案大小、及導演、演員、製作單位等就是視頻檔案的中繼資料。

在地理空間資訊中用於描述地理資料集的內容、品質、表示方式、空間參考、管理方式以及資料集的其他特徵,它是實 現地理空間資訊共用的核心標準之一。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.