如何在c#函数中从委托中获取地址
本文关键字:获取 地址 函数 | 更新日期: 2023-09-27 18:12:27
我有一些DLL文件。它包含一些方法,名称是"ABSDefaultCallback"。我这样赋值这个方法
IntPtr hMod = LoadLibrary("bsgui.dll");
IntPtr pAddr = GetProcAddress(hMod, "ABSDefaultCallback");
op.Callback = pAddr;
工作得很完美。但是我想调用我自己的方法名字是"Callback"除了"ABSDefaultCallback"我试着这样做。
DELEGATE_TestFunc fred = new DELEGATE_TestFunc(Callback);
void* pfred = Marshal.GetFunctionPointerForDelegate(fred).ToPointer();
op.Callback = (IntPtr)pfred;
但是这个不能完美地工作。如何解决我的问题?
我假设您通过p/Invoke所做的一切都有正确的签名。如果你没有,那么你需要先修复它。
根据本文,您可能遇到委托被垃圾收集的问题。
他们在委托上使用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