.net 对垃圾回收委托进行了回调

cwtwac6a  于 2022-12-01  发布在  .NET
关注(0)|答案(1)|浏览(188)

出现错误:
对WaveLib类型的垃圾回收委托进行了回调。WaveNative+WaveDelegate::Invoke '。这可能会导致应用程序崩溃、损坏和数据丢失。将委托传递给非托管代码时,托管应用程序必须使这些委托保持活动状态,直到保证它们永远不会被调用为止。
我的函数从C++ DLL中被调用。
我的代码:

Public Delegate Sub MyDelegate()

<DllImport("file.dll")> Public Function FuncRegister(ByVal pFunc As MyDelegate) As Integer
End Function

FuncRegister(AddressOf MyCallback);

Public Sub MyCallback()
  counter = counter + 1
End Sub
guicsvcw

guicsvcw1#

以下是如何在C#中使回调保持活动状态的方法,以供参考

public delegate void SampleCallback();

static class MyManagedAPI
{
    [DllImport("MyManagedDll.dll")]
    public static extern unsafe int RegisterCallback(void* callback);
}

unsafe static void RegisterCallback(SampleCallback callback)
{
    GCHandle handle = GCHandle.Alloc(callback); // keep the callback alive. Don't forget to release this later

    IntPtr pCallback = Marshal.GetFunctionPointerForDelegate(callback);

    MyManagedAPI.RegisterCallback((void*)pCallback);
}

相关问题