将VB函数回调作为参数传递给.NET

时间:2020-06-12 09:03:14

标签: .net com vb6 interop

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运算符的无效使用”?

1 个答案:

答案 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!

相关问题