首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 應用程式域基礎:建立、隔離與卸載完整指南

     編輯:關於.NET

應用程式域 是 .NET 執行環境的核心隔離單位。與作業系統進程不同,單一進程可承載多個 AppDomain,大幅降低上下文切換成本,並提供錯誤隔離、安全性邊界與動態卸載能力。

AppDomain 五大核心優勢

  1. 錯誤隔離:單一域例外不波及其他域
  2. 型別安全保證:防止記憶體損毀跨域蔓延
  3. 獨立生命週期:可單獨卸載域而不終止進程
  4. 程式碼可卸載:釋放域專屬組件與資料結構
  5. 存取隔離:跨域物件需透過複本或 Proxy(遠端呼叫基礎設施)

建立與列舉 AppDomain

class Program {
    static void Main() {
        AppDomain myDomain = AppDomain.CreateDomain("xuanhunDomain");
        Console.WriteLine("新域名稱: {0}", myDomain.FriendlyName);
        Console.WriteLine("當前域名稱: {0}", AppDomain.CurrentDomain.FriendlyName);
        Console.ReadKey();
    }
}

輸出應用程式域名稱

圖 1 建立並列印自訂與預設 AppDomain 名稱

卸載 AppDomain 與例外處理

AppDomain.Unload(myDomain);
try {
    Console.WriteLine(myDomain.FriendlyName); // 觸發 CannotUnloadAppDomainException
} catch (CannotUnloadAppDomainException e) {
    Console.WriteLine(e.Message);
}

卸載後存取拋出例外

圖 2 卸載後嘗試存取域屬性拋出異常

卸載關鍵規則

  • 僅能卸載 特定於域 的組件;共用組件 (GAC) 需結束進程才能釋放
  • 若域內有執行緒未返回、或鎖定資源,會擲回 CannotUnloadAppDomainException
  • SetAccessRuleProtection(true, false) 可切斷父域安全設定繼承

跨域呼叫:By Value vs. By Reference

方式機制適用場景
MarshalByValue (序列化複本)物件完整複製至呼叫端域小型、不可變資料傳遞
MarshalByRefObject (Proxy)透過 Proxy 遠端呼叫原物件大型物件、需維持單一狀態

注意:跨域呼叫元資料必須雙向可見,否則 JIT 編譯失敗拋出 FileNotFoundException。


作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved