Маршалировать список объектов из VB6 в C#

У меня есть разработка, которая требует передачи объектов между приложением VB6 и библиотекой классов С#. Объекты определены в библиотеке классов C# и используются в качестве параметров для методов, предоставляемых другими классами в той же библиотеке. Все объекты содержат простые строковые/числовые свойства, поэтому маршалинг был относительно безболезненным.

Теперь у нас есть требование передать объект, который содержит список других объектов. Если бы я кодировал это в VB6, у меня мог бы быть класс, содержащий коллекцию в качестве переменной-члена. В С# у меня может быть класс с переменной-членом списка.

Можно ли создать класс C# таким образом, чтобы приложение VB6 могло заполнить этот внутренний список и успешно его маршалировать? У меня здесь нет большого опыта, но я думаю, мне придется использовать массив типов объектов.


person Andrew    schedule 27.04.2010    source источник


Ответы (1)


Возможности в COM более ограничены, чем в C#:

  • Вы не можете использовать дженерики (COM не поддерживает это, и TLBEXP не будет использовать их)

  • Есть старый класс ArrayList. Или массив.

  • Уровень взаимодействия COM автоматически создаст перечислитель COM для класса C#, который реализует IEnumerable (неуниверсальная версия), вы можете повторить его на стороне VB6 с помощью For Each.

  • Точно так же он создает IEnumerable для класса COM, реализующего перечислитель COM. Вы можете использовать foreach в коде C# для перечисления коллекции VB6. Выбирайте между ними в зависимости от того, кто создает коллекцию.

person Hans Passant    schedule 27.04.2010
comment
Звучит интересно, копнув немного глубже, мне нужно явно реализовать IEnumerable И добавить метод GetEnumerator с необходимыми атрибутами. Я думаю, что если я смогу собрать какой-нибудь класс-оболочку, это может просто полететь, спасибо! - person Andrew; 27.04.2010
comment
@Andrew Вам действительно нужно вручную реализовать IEnumerable и добавить GetEnumerator? Разве вы не можете просто использовать List, у которого они неявно есть? Я бы подумал, что уровень COM-взаимодействия будет в порядке с этим. - person MarkJ; 28.04.2010