Visual Basic程序的一部分正在移至.NET dll。
参数调用可以成功传递,并且一切运行正常。
如何在长时间运行异步任务后传递VB6的.NET回调函数来调用?
在.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的对象浏览器中:
Function DoSomething(strA As String, strB As String, strC As String,
parent As Long, [CallbackAddr As VBCallBackFunc]) As Boolean
Member of DotNetLib
但是它说“ AddressOf运算符的无效使用”?
答案 0 :(得分:3)
与使用事件相关的注释是一个不错的选择,但是我倾向于更多地使用接口,因此这是一种解决方案。
(手写代码,您需要进行语法检查,并且可以清除名称,它们只是出于说明目的)
在.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持有对VB6对象的引用,因此请确保在.NET端有一种方法可以清理并释放所有引用。
另一件事要注意。除了主UI线程外,不要调用其他线程回VB6!