您可以使用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);
您將要添加的錯誤檢查,我在一個簡潔的例子的利益切除。
現在,如果你在控制非託管庫,我仍然會建議添加一個函數來封裝寫入這個函數指針。這對我來說就像一個更好的界面。
啊,不知道那個,但是我怎麼會指定一個代表呢? – thalm 2012-04-08 21:43:04
是的,我現在接受你的答案,因爲它是我的問題的正確答案。但由於我使用的DLL是開源的,我可能會像usr建議的那樣添加setter方法。我發現這是有幫助的:http://stackoverflow.com/questions/2167895/howto-implement-callback-interface-from-unmanaged-dll-to-net-app – thalm 2012-04-08 22:01:20
有趣的問題,我同意,一個二傳手是如果您正在編譯本機代碼,那麼這是一個正確的解決方案 – 2012-04-08 22:06:10