如何从委托中获取C#函数的地址?

时间:2011-10-27 04:53:08

标签: c# .net c++ c#-4.0

我有一些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;

但是这个并不完美。如何解决我的问题?

1 个答案:

答案 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.Allocgch.Free包装在实现IDisposable的对象中,并可能考虑使用SafeHandle

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