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 ...
此技術常用於插件掃描、動態類型發現、相依性分析工具開發。
using 引入命名空間;Add Reference 參考組件掌握 AppDomain 與組件動態操作,是構建高擴展性、高穩定性 .NET 應用的關鍵技能。