Accessing .NET Collection in VB6

落爺英雄遲暮 提交于 2019-12-06 13:44:56

问题


I have a .NET assembly that has routines that need to be called from a VB6 dll. The .NET assembly's routines, for other .NET code will return Lists of objects. However that won't work for VB6. So I am using Interop to create a "vb6 class" that will return the data needed. I had read that the VB.NET Collection is compatible with the VB6 Collection, but I've found that to be untrue. My simple test consists of:

.NET Code:

<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()

At this line, I'm receiving a "Type Mismatch, Error 13" error.

I'm kind of at a loss. I basically need to return a list or array of items from the .NET code - I'm already going to have to pack the existing .NET class object into a string or something to return to VB6 (which will then have to unpack it), so I was trying to make it slightly easier on myself.

Any suggestions or hints will be appreciated!

Thanks.


回答1:


Microsoft.VisualBasic.Collection is compatible member-wise, but it's not the same type.

Why not just return an array? Of strings, or of your COM-visible .NET classes?
Or create an indexed property?


Having that said, why not return IList in the first place? IList is COM-visible.
This works:

<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



回答2:


You can return object's array its more light with "Microsoft.VisualBasic.Collection" i never work well the end is the same you have convert from type to type, something how that

Dim a As MyDotNet.MyCOMClass
dim ptr as variant
Set a = New MyDotNet.MyCOMClass
Dim c As Collection
ptr = a.TestMe()
Set c = ptr

if that not work return array of objects. remember you have enable in project settings

application -> assembly information -> Make assembly COM-Visible (true) and compile -> Register for COM interop (true)



来源:https://stackoverflow.com/questions/6231995/accessing-net-collection-in-vb6

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!