アンマネージドDLLを遅延バインディングで動的にロードするクラス
using System;
using System.Runtime.InteropServices;
public class UnManagedDll :IDisposable {
[DllImport("kernel32")]
static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32")]
static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
[DllImport("kernel32")]
static extern bool FreeLibrary(IntPtr hModule);
IntPtr moduleHandle;
public UnManagedDll(string lpFileName) {
moduleHandle = LoadLibrary(lpFileName);
}
public IntPtr ModuleHandle {
get {
return moduleHandle;
}
}
public T GetProcDelegate<T>(string method) where T :class {
IntPtr methodHandle = GetProcAddress(moduleHandle, method);
T r = Marshal.GetDelegateForFunctionPointer(methodHandle, typeof(T)) as T;
return r;
}
public void Dispose() {
FreeLibrary(moduleHandle);
}
}
以下の様に使用する。
using System;
class Program {
delegate int MessageBoxADelegate(IntPtr hWnd, string lpText, string lpCaption, uint uType);
static void Main(string[] args) {
using(UnManagedDll user32Dll = new UnManagedDll("user32.dll")) {
MessageBoxADelegate MessageBoxA =
user32Dll.GetProcDelegate<MessageBoxADelegate>("MessageBoxA");
MessageBoxA(IntPtr.Zero, "テキスト", "キャプション", 0);
}
}
}