Как создать объект VBA.Collection () в c # - PullRequest
3 голосов
/ 15 декабря 2010

Мне нужно создать объект Interop VBA.Collection из кода C #
У меня есть ссылка на Interop.VBA в моем проекте

Когда я звоню так:

var col = new VBA.Collection()

ВВо время выполнения я получил сообщение об ошибке, говорящее, что dll не зарегистрирована ...
Я обнаружил, что: http://support.microsoft.com/kb/323737/en-us

Это может работать, но у меня нет компилятора VB6 на моем компьютере.
Интересно, вы знаете другой обходной путь (или, может быть, кто-то может скомпилировать мне этот ActiveX?)

Ответы [ 2 ]

4 голосов
/ 16 декабря 2010

Я не пробовал это, но это может сработать.

Создание библиотеки импорта для VBA6 VBA6.dll. Создайте собственную реализацию своего интерфейса _Collection. Используйте эту реализацию вместо класса VBA.Collection.

class MyCollection : VBA._Collection
{
    private Dictionary<object, object> _items = new Dictionary<object, object>();

    public void Add(ref object Item, [System.Runtime.InteropServices.OptionalAttribute]ref object Key, [System.Runtime.InteropServices.OptionalAttribute]ref object Before, [System.Runtime.InteropServices.OptionalAttribute]ref object After)
    {
        // Ignoring the Before and After params for simplicity
        _items.Add(Key, Item);
    }

    public int Count()
    {
        return _items.Count;
    }

    public System.Collections.IEnumerator GetEnumerator()
    {
        return _items.Values.GetEnumerator();
    }

    public dynamic Item(ref object Index)
    {
        return _items[Index];
    }

    public void Remove(ref object Index)
    {
        _items.Remove(Index);
    }
}
0 голосов
/ 05 ноября 2014

Я адаптировал это для 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, чтобы он его принял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...