Маршаллинг Microsoft.VisualBasic.Collection to COM - PullRequest
0 голосов
/ 16 мая 2018

У меня есть класс C #, который имеет свойство (имя List) типа Microsoft.VisualBasic.Collection.Нам нужно выставить это свойство для COM.Для этого я писал интерфейс для своего класса, чтобы свойство маршалировалось как UnmanagedType.IDispatch.Примерно так:

 [DispId(0x68030000)]
 Collection List { [DispId(0x68030000)] [return: MarshalAs(UnmanagedType.IDispatch)] get; }

Этот фрагмент кода был ранее в VB и использовался C ++ как тип VT_DISPATCH.Однако при создании библиотеки C # я получаю следующую ошибку:

C: \ Program Files (x86) \ MSBuild \ 14.0 \ bin \ Microsoft.Common.CurrentVersion.targets (4335,5): ошибка MSB3212: сборка «Name.dll» не может быть преобразована в библиотеку типов.Экспортер библиотеки типов обнаружил ошибку при обработке 'Namespace.InterfaceName.get_List (# 0), ProjectName'.Ошибка: Ошибка при загрузке библиотеки типов / DLL.

Я прочитал несколько постов в Интернете, в которых предполагалось, что такие ошибки могут возникать из-за повторяющихся идентификаторов GUID.Но это не тот случай.Я пытался с несколькими GUID.Я не чувствую, что это проблема с любым другим атрибутом, который я установил в своем интерфейсе, поскольку я могу маршалировать другие свойства и вызовы функций (некоторые из них используют примитивные типы, а другие используют пользовательские классы).

Вот как он используется в потребляющем приложении C ++:

LPDISPATCH result;
InvokeHelper(0x68030000, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;

Эта проблема стала действительной для клиента, и у меня действительно не так много времени, чтобы продолжить расследование, поскольку это должно произойти завтра.

Ценю любую помощь!

1 Ответ

0 голосов
/ 18 мая 2018

Я не думаю, что Microsoft.VisualBasic.Collection является COM-видимым.Следовательно, вы не можете использовать этот тип в качестве возвращаемого значения или параметра в классе или интерфейсе COM.Однако ICollection (который реализует Microsoft.VisualBasic.Collection) является видимым COM.Если это соответствует вашим целям, используйте это как тип вашей собственности, а не Microsoft.VisualBasic.Collection.

...