iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
自我挑戰組

C# 和 SQL 探索之路系列 第 20

Day 20: C# 引用第三方程式: 動態載入、反射 (Reflection)

  • 分享至 

  • xImage
  •  

大家好,很快又來到第 20 天。

昨天提到的使用 dllimport 屬性呼叫 C++ DLL 內的方法。如果 DLL 是由 C# 等 .Net 為基礎的語言寫成的,可以直接從 Visual Studio 中透過專案的參考加入,且呼叫方法和一般方法一致。如果要透過程式碼動態載入 DLL,則可閱讀以下的做法。

動態載入 DLL

  • 可以使用 Assembly.LoadFrom("MyAssembly.dll") 載入特定的 DLL 檔。
  • Assembly.GetType(string name) 應用反射 (Reflection) 技術建立物件實例,使用的 name,是 namespace + class name (命名空間 + 類別名稱)。
  • 先使用 is 檢查 Activator.CreateInstance 載入的 Object 是否為已知的類別,若是的話, 使用 as 轉為該類別物件,並進行後續操作。

範例程式

專案A 提供的介面:

public interface IReflectionTest{
    public void Test();
}

專案 B 參考了專案 A,並實作介面的類別:

namespace PrintLibrary
{
    public class PrintTestClass : IReflectionTest
    {
        public void Test()
        {
            Console.WriteLine("Test method executed.");
        }
    }
}

在專案 A 內動態載入 DLL,並存取專案 B 的 PrintTestClass 的類別方法。

Assembly printDll = Assembly.LoadFrom(@"bin\Debug\net6.0\PrintLibrary.dll");
Type typeTest = printDll.GetType("PrintLibrary.PrintTestClass");
Console.WriteLine(typeTest.ToString());
var printTestClass = Activator.CreateInstance(typeTest);
if(printTestClass is IReflectionTest){
    IReflectionTest printTest = printTestClass as IReflectionTest;
    printTest.Test();
}

範例程式碼
範例程式碼 (專案 A 介面)
範例程式碼 (專案 B)

其他

參考資料


上一篇
Day 19: C# 引用第三方程式: DLLImport
下一篇
Day 21: C# 除錯技巧
系列文
C# 和 SQL 探索之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言