您可以使用LoadLibrary
andGetProcAddress
获取指向导出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);
您将需要添加我为了简洁示例而删除的错误检查。
现在,如果您可以控制非托管库,我仍然建议添加一个函数来封装对该函数指针的写入。这对我来说感觉像是一个更好的界面。