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

问题描述 投票:1回答:1

一个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操作符"?

.net com vb6 interop
1个回答
3
投票

使用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!

© www.soinside.com 2019 - 2024. All rights reserved.