一个Visual Basic程序的一部分被移到.NET dll中。
参数调用可以成功传递& 一切运行正常。
如何传递VB6 for .NET的回调函数,让其在长时间运行的async任务后调用?
在.NET中
Public Delegate Function VBCallBackFunc() As Integer
Public Function DoSomething(a As String, b As String, c As String, _
parent As IntPtr, Optional ByVal CallbackAddr As VBCallBackFunc = Nothing) As Boolean Implements _DotNetLib.DoSomething
VB6
result = DotNetLib.DoSomething(strA, strB, strC, Me.hwnd, AddressOf DotNetCallback)
Public Function DotNetCallback() As Long
MsgBox ("Callback")
End Function
在VB.NET.NET的对象浏览器中,可以看到 "无效使用AddressOf运算符 "的字样。
Function DoSomething(strA As String, strB As String, strC As String,
parent As Long, [CallbackAddr As VBCallBackFunc]) As Boolean
Member of DotNetLib
但它说 "无效使用AddressOf操作符"?
使用Events的相关评论是一个不错的选择,但我更倾向于使用接口,所以这里有一个解决方案。
(自由手写的代码,你需要进行语法检查,名字也可以清理一下,只是为了说明问题)
在.NET中。
为你的回调创建一个COM暴露的接口。
Public Interface IVBCallBack
Public Function VBCallBackFunc() As Integer
End Interface
把DoSomething改成这样:
Public Function DoSomething(a As String, b As String, c As String, parent As IntPtr, ByVal CallbackAddr As IVBCallBack) As Boolean
在VB6中:
result = DotNetLib.DoSomething(strA, strB, strC, Me.hwnd, Me)
(你将需要你的类、控件或表单来实现) Implements IVBCallBack
)
Public Function IVBCallBack_VBCallBackFunc() As Long
MsgBox ("Callback")
End Function
确保在.NET端有一个方法来清理和释放所有的引用,因为.NET持有对VB6对象的引用。
还有一件事要注意。 不要在主界面线以外的任何线上调用回调到VB6!