在VB6中访问.NET集合

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

我有一个.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的内容(然后必须将其解压缩) ,所以我试图让自己更轻松一些。

任何建议或提示将不胜感激!

谢谢。

.net vb6 interop
3个回答
4
投票

Microsoft.VisualBasic.Collection是成员兼容的,但类型不同。

为什么不只返回一个数组?是字符串,还是COM可见的.NET类?还是创建索引属性?


话虽如此,为什么不首先返回IListIList是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

0
投票

您可以使用“ 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)


0
投票

如果使用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
© www.soinside.com 2019 - 2024. All rights reserved.