1. はじめに
- C#で外部DLLを指定して実行したい
- DLL名は参照設定せず、動的に取得したい
2. 開発環境
- C#
- .NET8
- Visual Studio 2022
- Windows 11
3. DLLサンプル作成 (呼び出し先)
- C#のクラスライブラリプロジェクトよりサンプルのDLLを作成する
namespace ClassLibrary1
{
public class DLLTest
{
public int Id { get; set; }
public string Name { get; set; }
// コンストラクタ(引数なし)
public DLLTest() : this(0, "") { }
// コンストラクタ(引数あり)
public DLLTest(int id, string name) => (Id, Name) = (id, name);
// 文字列変換
public override string ToString() => $"Id={Id},Name={Name}";
}
}
4. サンプルソース (呼び出し元)
- DLLをEXEと同じフォルダに配置して実行する
using System.Reflection;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
try
{
var asm = Assembly.LoadFrom("ClassLibrary1.dll"); // アセンブリの読み込み
var module = asm.GetModule("ClassLibrary1.dll"); // アセンブリからモジュールを取得
var DLLTest = module?.GetType("ClassLibrary1.DLLTest"); // 利用するクラス(or 構造体)を取得
if (DLLTest != null)
{
// CSharpDll.Personクラスをインスタンス化.
// コンストラクタへ引数を渡すことも可能.
dynamic p1 = Activator.CreateInstance(DLLTest, 1, "TEST");
if (p1 != null)
{
// dynamicで受けているので, 面倒なプロパティ取得やメソッド取得を省略できる.
Console.WriteLine($"name= {p1.Id}");
Console.WriteLine($"age= {p1.Name}");
Console.WriteLine(p1.ToString());
}
}
Console.ReadKey();
} catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
5. 参考文献