C# 70-536 – Chapter 8 Application Domains and Services(1) - Application Domains
「應用程式定義域(Application Domains)」是一個邏輯的儲存空間,允許在同一個Process中執行多個組件,不過它可以防止直接存取其他組件的記憶體。例:IIS 5.0的ASP.NET 工作處理序(worker process),他的實作檔為Aspnet_wp.exe。如果同時有10個人瀏覽某個網站,則會為每位使用者建立一個應用程式定義域。
通常基於安全的理由而隔離組件外,也可以利用應用程式定義域改善可靠性與效率:
可靠性:
如果某項工作的應用程式定義域狀態變得不穩定,可以直接將該應用程式定義域卸載,而不會影響到處理序。
效率:
如果某個組件被載入到預設的應用程式定義域,在處理序執行時,該組件無法從從記憶體被卸載。不過,如果開啟第二個定義域,載入並執行組件,則當此定義域被卸載的時候,該組件也會跟著被卸載。這項技巧可以讓長時間須要執行且偶爾會使用到大型動態鏈結程式庫(dynamic-link libraries; DLL)的處理序工作集變小。
建立定義域:載入的方式有二種,依路徑 or 名稱。(建立後可以用domain.Evidence屬性查詢,但為唯讀)
AppDomain domain = AppDomain.CreateDomain("NewDomain");
Console.WriteLine("Host Domain:" + AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("Child Domain:" + domain.FriendlyName);
//載入組件
domain.ExecuteAssembly("Assembly.exe"); //path
domain.ExecuteAssemblyByName("Assembly"); //name
//卸載靜態方法
AppDomain.Unload(domain);
設定權限:可依組件 or 定義域
Evidence internetEvidence = new Evidence(hostEvidence, null);
domain.ExecuteAssembly("SecondAssembly.exe", internetEvidence); //限制組件
AppDomain d = AppDomain.CreateDomain("SecurityDomain", internetEvidence); //限制定義域
設定定義域的組態:
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = "file://" + System.Environment.CurrentDirectory; //設定起始目錄
ads.DisallowBindingRedirects = false; //不允許重新繫結
ads.DisallowCodeDownload = true; //允許http下載
ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; //設定檔位置
AppDomain newDomain = AppDomain.CreateDomain("SetDomain", null, ads);
Dotblogs 的標籤:C#,MCTS 70-536