我有一个.NET程序集,该程序具有需要从VB6 dll调用的例程。对于其他.NET代码,.NET程序集的例程将返回对象列表。但是,这不适用于VB6。因此,我正在使用Interop创建“ vb6类”,该类将返回所需的数据。我已经读过VB.NET集合与VB6集合兼容,但是我发现这是不正确的。我的简单测试包括:
。NET代码:
<ClassInterface(ClassInterfaceType.AutoDual)> _
Public Class MyCOMClass
Public Function TestMe() As Microsoft.VisualBasic.Collection
Dim ret As New Microsoft.VisualBasic.Collection
Dim inParam As String = "Stuff "
ret.Add(inParam)
ret.Add(inParam & "2")
ret.Add(inParam & "3")
ret.Add(inParam & "4")
Return ret
End Function
End Class
VB6:
Dim a As MyDotNet.MyCOMClass
Set a = New MyDotNet.MyCOMClass
Dim c As Collection
Set c = a.TestMe()
在此行,我收到“类型不匹配,错误13”错误。
我有点茫然。我基本上需要从.NET代码返回一个列表或项目数组-我已经必须将现有.NET类对象打包为字符串或返回VB6的内容(然后必须将其解压缩) ,所以我试图让自己更轻松一些。
任何建议或提示将不胜感激!
谢谢。
Microsoft.VisualBasic.Collection
是成员兼容的,但类型不同。
为什么不只返回一个数组?是字符串,还是COM可见的.NET类?还是创建索引属性?
话虽如此,为什么不首先返回IList
? IList
是COM可见的。这有效:
<Microsoft.VisualBasic.ComClass()> _
Public Class Class1
Public Function Test() As IList
Dim l() As String = New String() {"abc", "def", "42"}
Return l
End Function
End Class
Private Sub Command1_Click()
Dim c As New ClassLibrary1.Class1
MsgBox c.Test(2)
End Sub
您可以使用“ Microsoft.VisualBasic.Collection”将对象的数组返回其更多内容,但我永远无法正常工作,最终是您从类型转换为类型的结果一样,这是怎么回事
Dim a As MyDotNet.MyCOMClass
dim ptr as variant
Set a = New MyDotNet.MyCOMClass
Dim c As Collection
ptr = a.TestMe()
Set c = ptr
如果不起作用,则返回对象数组。记住您已经在项目设置中启用了
应用程序->程序集信息->使程序集成为COM-Visible(true)和编译->注册COM互操作(true)
如果使用Microsoft.VisualBasic.Collection
遇到问题,以下解决方案可能对您有用。
创建一个新对象,该对象继承.NET List类并公开COM方法供VB6侧使用。
您可以返回此新对象的单个实例,该实例可以提供对集合的访问。
此方法的最大好处是,您可以使用诸如Contains或Find的其他方法来扩展类。
示例:
Imports System.Runtime.InteropServices
<Guid("7D799AD7-9F82-44F9-A86F-DEE5A0B22268")>
<ComVisible(True)>
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>
Public Interface ITotals
<DispId(1)>
Function Item(i As Integer) As Total
<DispId(2)>
ReadOnly Property Count() As Integer
<DispId(3)>
Function AddTotal(label As String, weight As Double, qty As Integer) As Total
End Interface
<Guid("EFC518C6-781A-4A28-BF7B-A9AFC14C4F03")>
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.None)>
Public Class Totals
Inherits List(Of Total)
Implements ITotals
Public Shadows Function Item(i As Integer) As Total Implements ITotals.Item
Return MyBase.Item(i)
End Function
Public Shadows ReadOnly Property Count() As Integer Implements ITotals.Count
Get
Return MyBase.Count
End Get
End Property
Public Function AddTotal(label As String, weight As Double, qty As Integer) As Total Implements ITotals.AddTotal
Dim t As New Total
t.Label = label
t.Weight = weight
t.Qty = qty
MyBase.Add(t)
Return t
End Function
End Class