應用程式定義域概觀

更新:2007 年 11 月

在過去,一直是用處理序 (Process) 界限來隔離在同一電腦上執行的應用程式。每個應用程式都會被載入用來分隔在同一電腦上執行之不同應用程式的個別處理序中。

這些應用程式所以能被分隔,是因為記憶體位址是相對於處理序;從一個處理序傳遞到另一個處理序的記憶體指標,在目標處理序中無法以任何有意義的方式使用。此外,您也不能在兩個處理序之間直接進行呼叫。而必須使用提供了一層間接取值 (Indirection) 的 Proxy。

Managed 程式碼必須通過驗證程序才能夠執行 (除非系統管理員已授予略過驗證的使用權限)。驗證過程中會決定程式碼是否可能嘗試存取無效的記憶體位址,或執行可能導致執行該程式碼之處理序無法正常運作的動作。通過驗證測試的程式碼被稱為型別安全。驗證程式碼是否為型別安全的能力,可以讓 Common Language Runtime 以極低的效能損失,提供盡可能與處理序界限同樣高的隔離等級。

應用程式定義域提供了安全且多用途的處理單位,可以讓 Common Language Runtime 用來提供應用程式間的隔離。使用存在於個別處理序中的相同隔離等級,您可以在單一處理序中執行好幾個應用程式定義域,而不會造成進行跨處理序呼叫或在處理序間切換的額外負荷。在單一處理序中執行多個應用程式的能力大幅增加了伺服器的延展性 (Scalability)。

隔離應用程式對於應用程式安全性也極為重要。例如,您可以從單一瀏覽器處理序中的幾個 Web 應用程式執行一些控制項,而且以此方法讓這些控制項不能存取彼此的資料和資源。

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

  • 在某一應用程式中的錯誤不會影響其他應用程式。由於型別安全程式碼不會導致記憶體錯誤,所以使用應用程式定義域可確保在某一定義域中執行的程式碼不會影響處理序中的其他應用程式。

  • 可以停止個別應用程式而不需停止整個處理序。使用應用程式定義域可以讓您卸載在單一應用程式中執行的程式碼。

    注意事項:

    您不能卸載個別組件或型別。只有完整的定義域可以卸載。

  • 在某一應用程式中執行的程式碼不能直接從其他應用程式存取程式碼或資源。Common Language Runtime 是藉由防止不同應用程式定義域中物件之間的呼叫來強制執行這種隔離。在不同定義域之間傳遞的物件必須用複製方式傳遞或由 Proxy 存取。如果物件是複製的,那麼對該物件的呼叫就是區域呼叫。也就是說,呼叫端和被參考的物件是在同一個應用程式定義域中。如果物件是透過 Proxy 存取,那麼對物件的呼叫便是遠端呼叫。在這種情況下,呼叫端和被參考的物件是在不同的應用程式定義域中。跨定義域呼叫是使用與兩個處理序或兩部電腦之間呼叫相同的遠端呼叫基礎結構。因此,所參考之物件的中繼資料 (Metadata) 必須在這兩個應用程式定義域中都能使用,才能讓該方法呼叫被 JIT 適當地編譯。如果呼叫定義域無權存取所呼叫的物件之中繼資料,則編譯可能會失敗,並擲回型別 System.IO.FileNotFound 的例外狀況。如需詳細資訊,請參閱 .NET 遠端處理。決定如何跨定義域存取物件的機制是由該物件決定。如需詳細資訊,請參閱 MarshalByRefObject 類別

  • 程式碼的行為範圍是由執行該程式碼的應用程式決定。換言之,應用程式定義域會提供應用程式版本原則、它所取之任何遠端組件的位置,以及有關在哪裡尋找載入定義域中之組件等組態設定。

  • 授予程式碼的使用權限可以由執行該程式碼的應用程式定義域控制。

請參閱

概念

執行階段主應用程式

參考

MarshalByRefObject

其他資源

應用程式定義域

裝載 Common Language Runtime