我有一些DLL文件。它包含一些名称为“ABSDefaultCallback”的方法。所以我像这样分配这个方法。
IntPtr hMod = LoadLibrary("bsgui.dll");
IntPtr pAddr = GetProcAddress(hMod, "ABSDefaultCallback");
op.Callback = pAddr;
完美的工作。但我想调用我自己的方法,除了“ABSDefaultCallback”之外,其名称为“Callback”。我试着这样做。
DELEGATE_TestFunc fred = new DELEGATE_TestFunc(Callback);
void* pfred = Marshal.GetFunctionPointerForDelegate(fred).ToPointer();
op.Callback = (IntPtr)pfred;
但是这个并不完美。如何解决我的问题?
答案 0 :(得分:1)
我假设您通过p / Invoke对所做的一切都有正确的签名。如果你不这样做,那么你需要先修复它。
根据this article,您可能遇到代理被垃圾回收的问题。
他们在委托上使用GCHandle.Alloc
来创建一个不会被垃圾回收的引用。
static void DemonstrateCallBack_With_GCHandle()
{
var callback_delegate = new CallBack(CallBackFunction);
GCHandle gch = GCHandle.Alloc(callback_delegate);
IntPtr intptr_delegate =
Marshal.GetFunctionPointerForDelegate(callback_delegate);
PerformActionWithCallBack(intptr_delegate);
gch.Free();
}
如果最终为您效果,我建议您将GCHandle.Alloc
和gch.Free
包装在实现IDisposable
的对象中,并可能考虑使用SafeHandle
本文可能会提供一些相关的详细信息:http://obiwanjacobi.blogspot.com/2007/05/robust-pinvoke-for-windows-midi-api.html