Доступ к .NET Collection в VB6 - PullRequest
1 голос
/ 03 июня 2011

У меня есть сборка .NET, в которой есть подпрограммы, которые нужно вызывать из библиотеки VB6. Процедуры сборки .NET для другого кода .NET будут возвращать списки объектов. Однако это не будет работать для VB6. Поэтому я использую Interop для создания «класса vb6», который будет возвращать необходимые данные. Я читал, что VB.NET Collection совместим с VB6 Collection, но я обнаружил, что это не соответствует действительности. Мой простой тест состоит из:

.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 (который затем должен будет распаковать его) поэтому я пытался сделать это немного легче для себя.

Любые предложения или советы будут оценены!

Спасибо.

Ответы [ 2 ]

4 голосов
/ 04 июня 2011

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
0 голосов
/ 04 июня 2011

Вы можете вернуть массив объекта более легким с помощью «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)

...