大家好,很快又來到第 20 天。
昨天提到的使用 dllimport
屬性呼叫 C++ DLL 內的方法。如果 DLL 是由 C# 等 .Net 為基礎的語言寫成的,可以直接從 Visual Studio 中透過專案的參考加入,且呼叫方法和一般方法一致。如果要透過程式碼動態載入 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)
Environment.Is64BitOperatingSystem
屬性:可以用來檢查作業環境是否為 64 bit 的作業系統。