2011-06-03 53 views
1

我有一个需要从VB6 dll调用例程的.NET程序集。 .NET程序集的例程,用于其他.NET代码将返回对象列表。但是这对VB6不起作用。所以我使用Interop来创建一个“vb6类”,它将返回所需的数据。我读过VB.NET集合与VB6集合兼容,但我发现这是不真实的。我简单的测试包括:在VB6中访问.NET集合

.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(然后将其解压缩) ,所以我试图让自己稍微容易些。

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

谢谢。

回答

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

标记此一个的答案,如这几乎是我所做的。暴露一些简单的对象,并使用数组来传递信息。 – 2011-06-20 13:27:25

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可见(真) 和 编译 - >注册为COM Interop(真)

+0

我永远无法让VB6 Collection类与.NET Collection类“玩得很好” - 一直告诉我它们不兼容。 – 2011-06-20 13:28:16