System.Reflection.Assembly 類別是存取與操作 .NET 組件中繼資料的核心入口。本文系統整理其核心功能:載入組件、取得組件資訊、列舉型別,並提供完整範例。
| 分類 | 成員 | 用途 |
|---|---|---|
| 靜態載入方法 | Load(AssemblyName) |
依組件顯示名稱載入(從 GAC 或應用程式基底目錄) |
LoadFrom(string path) |
依完整路徑載入組件檔案 | |
| 屬性 | FullName |
取得組件完整顯示名稱(含版本、文化特性、公開金鑰標記) |
| 方法 | GetTypes() |
取得組件中定義的所有公開與非公開型別 |
| 方法 | GetExportedTypes() |
僅取得公開匯出的型別 |
| 方法 | GetType(string name) |
依名稱取得特定型別 |
| 方法 | CreateInstance(string typeName) |
建立指定型別的實例 |
using System;
using System.Reflection;
namespace AssemblyDemo
{
public class AssemblyInspector
{
public static void InspectAssembly(string assemblyPathOrName)
{
Assembly assembly;
try
{
// 嘗試以路徑載入(支援絕對/相對路徑)
if (File.Exists(assemblyPathOrName))
{
assembly = Assembly.LoadFrom(assemblyPathOrName);
Console.WriteLine($"從路徑載入:{assemblyPathOrName}");
}
else
{
// 以顯示名稱載入
assembly = Assembly.Load(assemblyPathOrName);
Console.WriteLine($"以名稱載入:{assemblyPathOrName}");
}
}
catch (Exception ex)
{
Console.WriteLine($"載入失敗:{ex.Message}");
return;
}
// 顯示組件完整資訊
Console.WriteLine($"\n組件完整名稱:{assembly.FullName}");
Console.WriteLine($"組件位置:{assembly.Location}");
Console.WriteLine($"映像執行階段版本:{assembly.ImageRuntimeVersion}");
// 列舉所有型別
Console.WriteLine($"\n定義的型別總數:{assembly.GetTypes().Length}");
Console.WriteLine("型別清單:");
foreach (Type type in assembly.GetTypes())
{
Console.WriteLine($" {type.FullName} ({type.IsPublic ? "public" : "internal"})");
// 可選:列舉成員
if (type.IsClass && !type.IsAbstract)
{
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
if (methods.Length > 0)
{
Console.WriteLine($" 公開方法:{string.Join(", ", methods.Select(m => m.Name))}");
}
}
}
}
}
}
// 目前正在執行程式碼所在的組件
Assembly current = Assembly.GetExecutingAssembly();
// 呼叫進入點的組件(通常是 .exe)
Assembly entry = Assembly.GetEntryAssembly();
// 包含指定型別的組件
Assembly containing = typeof(MyClass).Assembly;
var name = assembly.GetName();
Console.WriteLine($"名稱:{name.Name}");
Console.WriteLine($"版本:{name.Version}");
Console.WriteLine($"文化特性:{name.CultureInfo}");
Console.WriteLine($"公開金鑰標記:{BitConverter.ToString(name.GetPublicKeyToken())}");
// 讀取組件層級屬性
var titleAttr = assembly.GetCustomAttribute();
var versionAttr = assembly.GetCustomAttribute();
var descAttr = assembly.GetCustomAttribute();
Console.WriteLine($"標題:{titleAttr?.Title}");
Console.WriteLine($"檔案版本:{versionAttr?.Version}");
Console.WriteLine($"描述:{descAttr?.Description}");
LoadFrom 載入的組件進入 LoadFrom 載入脈絡,可能導致同一組件被載入多次Load 並確保組件在探測路徑中GetTypes() 可能拋 ReflectionTypeLoadException(含有無法載入的型別),需捕獲並檢查 LoaderExceptions掌握 Assembly 類別操作,是開發動態載入、外掛系統、框架基礎設施的關鍵技能。