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

.net 对垃圾回收委托进行了回调,.net,vb.net,dll,delegates,garbage-collection,.net,Vb.net,Dll,Delegates,Garbage Collection,我得到的错误是: 对类型为WaveLib.WaveNative+WaveDelegate::Invoke'的垃圾收集委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。当将委托传递给非托管代码时,托管应用程序必须使委托保持活动状态,直到保证永远不会调用委托为止 < >我的函数从C++ DLL调用。< /P> 我的代码: Public Delegate Sub MyDelegate() <DllImport("file.dll")> Public Function FuncRe

我得到的错误是:

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

< >我的函数从C++ DLL调用。< /P> 我的代码:

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
公共委托子MyDelegate()
作为整数的公共函数FuncRegister(ByVal pFunc作为MyDelegate)
端函数
FuncRegister(MyCallback的地址);
公共子类MyCallback()
计数器=计数器+1
端接头

只使用正确的语言标记如何?举个例子,这是一个传统的互操作错误。AddressOf表达式会动态生成委托对象。它不在任何地方引用,下一个GC将销毁它。当本机代码进行回调时返回。您必须使用GCHandle.Alloc()或将其存储在共享变量中,以便GC始终可以看到它。只使用正确的语言标记如何?举个例子,这是一个传统的互操作错误。AddressOf表达式会动态生成委托对象。它不在任何地方引用,下一个GC将销毁它。当本机代码进行回调时返回。您必须使用GCHandle.Alloc()或将其存储在共享变量中,以便GC始终可以看到它。