Я адаптировал это для vb.net, и мне пришлось исправить ключ, приходящий на добавление, потому что он отсутствует при отсутствии.
Я отредактирую этот пост после того, как протестирую его. Мне нужно убедиться, что он работает, когда VB6 вызывает dll .Net, передавая ему коллекцию vba в качестве параметра, а dll .Net передает другую коллекцию vba в качестве возвращаемого значения. Чувак, если это сработает, это избавит меня от многих неприятностей!
Public Class VBACollection
Implements VBA._Collection
Private _items As New Dictionary(Of Object, Object)
Public Sub Add(ByRef Item As Object, Optional ByRef Key As Object = Nothing, Optional ByRef Before As Object = Nothing, Optional ByRef After As Object = Nothing) Implements VBA._Collection.Add
' Ignoring the Before and After params for simplicity
Key = If(Key, Item)
_items.Add(Key, Item)
End Sub
Public Function Count() As Integer Implements VBA._Collection.Count
Return _items.Count
End Function
Public Function GetEnumerator() As System.Collections.IEnumerator Implements VBA._Collection.GetEnumerator, System.Collections.IEnumerable.GetEnumerator
Return _items.Values.GetEnumerator()
End Function
Public Function Item(ByRef Index As Object) As Object Implements VBA._Collection.Item
Return _items(Index)
End Function
Public Sub Remove(ByRef Index As Object) Implements VBA._Collection.Remove
_items.Remove(Index)
End Sub
End Class
EDIT:
Нет, это не работает с VB6. VB6 говорит:
"Класс не поддерживает автоматизацию или не поддерживает ожидаемый
интерфейс "
Класс, о котором идет речь, это мой класс, который использует VBACollection вместо VBA.Collection. VBACollection не является идентичным заменой для VBA.Collection. Я хотел бы выяснить почему и попытаться обмануть COM, чтобы он его принял.