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

C# 組件與應用程式域:動態載入、資料隔離與反射探索

     編輯:關於C#

AppDomain(應用程式域)是 .NET 運行時的隔離邊界,提供安全性、版本控制與資源管理機制。本文探討 AppDomain 的建立、組件載入執行、跨域資料交換,以及透過反射列舉已載入組件的技術。

一、建立與識別應用程式域

AppDomain domain = AppDomain.CreateDomain("MyDomain");
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); // 當前域名稱(如 "Csharp")
Console.WriteLine(domain.FriendlyName);                  // 新域名稱 "MyDomain"

每個域擁有獨立的組件載入清單、靜態變數、安全策略。預設域由 CLR 自動建立,對應可執行檔名稱。

二、跨域執行組件

if (AppDomain.CurrentDomain.FriendlyName != "MyAppDomain")
{
    AppDomain domain = AppDomain.CreateDomain("MyAppDomain");
    domain.ExecuteAssembly("Csharp.exe", null, args); // 在新域執行指定組件
}

適用於插件架構、腳本隔離、動態編譯執行等場景。新域中異常不會直接波及主域。

三、跨域資料儲存與交換

SetData/GetData 提供域級名值對儲存:

AppDomain d = AppDomain.CreateDomain("MyDomain");
ArrayList list = new ArrayList { "alive", "silver", "dog", "Ftp" };
d.SetData("para", list); // 存入新域

// 從新域讀取(需在該域內執行代碼才能直接存取)
// 此處演示在主域讀取剛存入的資料
foreach (string s in (ArrayList)d.GetData("para"))
    Console.WriteLine("you will see " + s);

注意:SetData/GetData 僅在同一進程內跨域共享資料,物件必須可序列化或繼承 MarshalByRefObject。

四、反射列舉域內已載入組件

using System.Reflection;

AppDomain d = AppDomain.CreateDomain("MyDomain");
Assembly[] assemblies = d.GetAssemblies();
foreach (Assembly ass in assemblies)
{
    Console.WriteLine("Name: " + ass.GetName().Name);
    Console.WriteLine("Version: " + ass.GetName().Version);
}

輸出示例:

Name: mscorlib
Version: 2.0.0.0
Name: Csharp
Version: 1.0.0.0
Name: System
Version: 2.0.0.0
...

此技術常用於插件掃描、動態類型發現、相依性分析工具開發。

五、命名空間與組件的關係補充

  • 命名空間:邏輯組織單位,編譯時期概念,不影響部署
  • 組件:物理部署單位,包含 IL 代碼、中繼資料、資源,有版本、文化特性、強名稱
  • 一個組件可包含多個命名空間;一個命名空間可跨多個組件
  • using 引入命名空間;Add Reference 參考組件

實務應用場景

  1. 插件系統:主程式建立獨立域載入插件組件,卸載域即可釋放所有資源
  2. 動態編譯執行:在隔離域編譯並執行使用者腳本,防止惡意代碼影響主程式
  3. 版本並存:不同域載入同一組件不同版本,解決 DLL Hell
  4. 記憶體管理:大量物件處理完畢後卸載整個域,比單一物件 GC 更徹底

掌握 AppDomain 與組件動態操作,是構建高擴展性、高穩定性 .NET 應用的關鍵技能。

AppDomain 基本輸出 進程視圖 跨域資料交換 組件列舉輸出 命名空間類別圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved