LoadLibrary
およびを使用GetProcAddress
して、エクスポートされたlibpd_printhook
変数へのポインターを取得できます。Marshal.WriteIntPtr
その後、とを使用Marshal.GetFunctionPointerForDelegate
してデリゲートに割り当てることができます。
[DllImport("kernel32", SetLastError=true, CharSet=CharSet.Unicode)]
static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true,
SetLastError=true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);
.....
IntPtr lib = LoadLibrary(@"mydll.dll");
IntPtr plibpd_printhook = GetProcAddress(lib, "libpd_printhook");
Marshal.WriteIntPtr(plibpd_printhook,
Marshal.GetFunctionPointerForDelegate(mydelegate));
FreeLibrary(lib);
簡潔な例のために、私が削除したエラーチェックを追加することをお勧めします。
これで、アンマネージライブラリを制御している場合でも、この関数ポインターへの書き込みをカプセル化する関数を追加することをお勧めします。それは私にとってより良いインターフェースのように感じます。