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

C# Assembly 類別操作組件資訊完整指南

     編輯:關於C#

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))}");
                    }
                }
            }
        }
    }
}

進階用法

1. 取得目前執行組件

// 目前正在執行程式碼所在的組件
Assembly current = Assembly.GetExecutingAssembly();

// 呼叫進入點的組件(通常是 .exe)
Assembly entry = Assembly.GetEntryAssembly();

// 包含指定型別的組件
Assembly containing = typeof(MyClass).Assembly;

2. 組件版本資訊

var name = assembly.GetName();
Console.WriteLine($"名稱:{name.Name}");
Console.WriteLine($"版本:{name.Version}");
Console.WriteLine($"文化特性:{name.CultureInfo}");
Console.WriteLine($"公開金鑰標記:{BitConverter.ToString(name.GetPublicKeyToken())}");

3. 自訂屬性讀取

// 讀取組件層級屬性
var titleAttr = assembly.GetCustomAttribute();
var versionAttr = assembly.GetCustomAttribute();
var descAttr = assembly.GetCustomAttribute();

Console.WriteLine($"標題:{titleAttr?.Title}");
Console.WriteLine($"檔案版本:{versionAttr?.Version}");
Console.WriteLine($"描述:{descAttr?.Description}");

常見應用場景

  • 外掛架構:動態載入 DLL、檢查介面實作、實例化外掛
  • 自動化測試:掃描測試組件、發現測試類別與方法
  • 序列化/設定:依型別名稱動態建立物件
  • 診斷工具:檢查載入組件版本、偵測版本衝突
  • 模組化系統:依需求載入功能模組組件

注意事項

  • LoadFrom 載入的組件進入 LoadFrom 載入脈絡,可能導致同一組件被載入多次
  • 偏好使用 Load 並確保組件在探測路徑中
  • GetTypes() 可能拋 ReflectionTypeLoadException(含有無法載入的型別),需捕獲並檢查 LoaderExceptions
  • 大型組件列舉型別有效能成本,建議快取結果

掌握 Assembly 類別操作,是開發動態載入、外掛系統、框架基礎設施的關鍵技能。

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