建立和設定應用程式定義域
主應用程式決定了要在哪裡設置應用程式定義域界限 (依據上一節所描述的準則) 之後,主應用程式就會使用 System.AppDomain 型別的 CreateDomain 方法來建立要在其中執行使用者程式碼的應用程式定義域。 每個應用程式定義域都含有主應用程式可以在其中儲存應用程式定義域相關資訊的名稱/值組的集合。 名稱/值配對會當做參數傳遞給 CreateDomain。
.NET Framework 定義了一些須由 Runtime 自發性了解的屬性。 這些屬性的名稱是由 System.AppDomain 類別中的靜態 (Static) 字串所定義。 主應用程式 (Host) 能夠設定自發性了解的屬性,以自訂應用程式定義域。 例如,這些屬性可以控制隔離在不同應用程式定義域中執行之程式碼的方式。 名稱/值組可以被擴充,以便讓主應用程式能夠定義可以在其中儲存其案例專屬資訊的自定屬性。
一般而言,應用程式定義域提供的隔離有兩種形式:
應用程式定義域會藉由防止一個應用程式定義域中的型別看見和呼叫其他應用程式定義域中的型別,來防止在這個應用程式定義域中執行的程式碼影響其他應用程式定義域。 應用程式定義域是依賴程式碼已經經過驗證的事實,來保護不受記憶體錯誤的影響。
主應用程式可以控制 Runtime 要到哪裡去尋找要載入特定應用程式定義域的程式碼 (代表 Runtime 本身)。 這一點相當重要,因為它可以防止某一個應用程式的程式碼無意間影響到其他應用程式。 將載入程式碼的要求限定為以這種方式的能力,與 Microsoft Win32 和 COM 目前運作的方式截然不同。 目前,在 Windows 裡,解析範圍是整個電腦,因為任何應用程式都可以使用登錄中所描述或置於熟知位置中 (例如 Windows 系統目錄) 的任何程式碼。 以這種方式共用是目前的預設,而這種行為也是造成 DLL 衝突的原因。
除了對於程式碼載入的方式加以限定之外,限定應用程式的組態資訊也很重要。 但是,對於許多組態設定而言,這一點目前還做不到。
例如,假設您要設定一部遠端電腦來執行 COM 類別,設定登錄中某個特定類別的 RemoteServerName 機碼,將會影響使用該類別的所有應用程式。 就像未知共用程式碼一樣,未知共用組態資料會妨礙應用程式完全控制它自己的行為。
AppDomainSetup.ApplicationBase 和 AppDomainSetup.ConfigurationFile 屬性會分別控制指定 Runtime 要在其中尋找組件之目錄,並藉以限定特定應用程式定義域之組態設定的能力。
ApplicationBase 會對應用程式定義域建立一個根目錄,讓 Runtime 在其下尋找私用組件。 如果主應用程式允許從磁碟載入組件,它必須提供 ApplicationBase 讓 Runtime 知道要在哪裡尋找載入的組件。
ConfigurationFile 屬性會指定 XML 檔案的名稱,該檔案中含有用來設定在應用程式定義域中執行之應用程式的設定值。 應用程式組態檔中設定值的範例包括組件版本控制規則,和如何找到能讓應用程式定義域中執行之型別遠端存取的型別的相關指示。
如需可供設定應用程式定義域之其他屬性的描述,請參閱 AppDomain 類別。
安全性提示 AppDomainSetup.DisallowCodeDownload 屬性的預設值為 false。 此一設定對服務而言是不具安全性的。 若要防止服務下載部分信任的程式碼,請將這個屬性設定為 true。