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

C# 組件與應用程式域深度解析:Assembly、AppDomain、反射載入與命名空間管理

     編輯:關於C語言

一、應用程式域:進程內的隔離邊界

AppDomain 是 CLR 提供的輕量級進程隔離單位,單一進程可包含多個 AppDomain,彼此記憶體隔離、安全性獨立、可獨立卸載。適用於外掛架構、動態程式碼載入、安全沙箱。

二、AppDomain 核心操作實戰

1. 建立與屬性


AppDomain domain = AppDomain.CreateDomain("MyDomain");
Console.WriteLine($"當前域: {AppDomain.CurrentDomain.FriendlyName}");
Console.WriteLine($"新域: {domain.FriendlyName}");

AppDomain建立示意 進程視圖

2. 執行組件


if (AppDomain.CurrentDomain.FriendlyName != "MyAppDomain")
{
    AppDomain newDomain = AppDomain.CreateDomain("MyAppDomain");
    newDomain.ExecuteAssembly("Csharp.exe", null, args);
}

3. 域內資料交換


AppDomain d = AppDomain.CreateDomain("MyDomain");
ArrayList list = new ArrayList { "alive", "silver", "dog", "FTP" };
d.SetData("para", list); // 跨域封送(需 Serializable)

foreach (string s in (ArrayList)d.GetData("para"))
    Console.WriteLine($"you will see {s}");

跨域資料交換

4. 列舉域內組件


using System.Reflection;

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

組件列舉結果

三、組件:部署、版本控制與安全性的基本單位

  • .dll / .exe 檔案即組件
  • 包含中繼資料(型別定義、版本、公開金鑰、相依性)
  • Assembly 類別提供載入、檢視、建立動態組件功能

四、命名空間:邏輯組織與類別消歧義

1. 解決同名類別衝突


using System.Net.Mail;
using System.Web.Mail;

// 錯誤:MailMessage 模稜兩可
// MailMessage mm = new MailMessage();

// 正確:完整限定名稱
System.Net.Mail.MailMessage mm1 = new System.Net.Mail.MailMessage();
System.Web.Mail.MailMessage mm2 = new System.Web.Mail.MailMessage();

2. 自訂命名空間定義與使用


// DemoLib.cs
namespace demostrator
{
    public class Demo
    {
        private string _name;
        public Demo() { _name = "luXiaofeng"; }
        public Demo(string name) { _name = name; }
        public string GetName() => _name;
    }
    public class Myname { /* 類似 */ }
}

// 使用端
using demostrator;

Demo d = new Demo();
Myname n = new Myname();
Console.WriteLine(d.GetName());
Console.WriteLine(n.GetName());

命名空間使用結果

3. 命名空間別名:消除衝突或簡化長名稱


using Short = MyCompany.LongNamespace.SubNamespace;
Short.MyClass obj = new Short.MyClass();

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

概念層面關係
命名空間邏輯/編譯期跨組件可共享同一命名空間(如 System)
組件物理/執行期單一組件可包含多個命名空間
引用專案參考引用組件 → 可使用其公開命名空間

總結

AppDomain 提供進程內隔離與動態載入能力,Assembly 是部署與版本單位,命名空間 則是原始碼層面的邏輯組織與消歧義機制。三者分工明確:執行期隔離靠 AppDomain,版本部署靠 Assembly,程式碼組織靠 Namespace。掌握反射 (System.Reflection) 配合 AppDomain 動態載入,是建構外掛系統、熱更新、腳本引擎的核心技術。

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