如何在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;

但是这个不能完美地工作。如何解决我的问题?

如何在c#函数中从委托中获取地址

我假设您通过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.Allocgch.Free包装在实现IDisposable的对象中,并可能考虑使用SafeHandle

本文可能会提供一些相关的细节:http://obiwanjacobi.blogspot.com/2007/05/robust-pinvoke-for-windows-midi-api.html