С С# я почти незнаком, но возник при работе такой вопрос.
Есть С++ проект в котором используется С# компонент.
Для взаимодействия пишем IDL и реализуем интерфейсы и на C++ и на C#. Через эти интерфейсы и взаимодействуем.
Появилась проблема передачи массива пользовательских структур.
Между С++ компонентами мы просто описывали это так в IDL:
HRESULT GetXXX([in] int i_nCount, [in, out, size_is(i_nCount)] GUID* io_pStudiesID );
т.е. указатель на первый элемент массива и кол-во элементов.
На # этот номер не прошел.
Ребята пишущие # компонент сказали что после обработки нашего tlb с помощью tlbimp они не могут расценивать это как массив.
Скажите пожалуйста, нельзя ли написать некий маршаллер который бы сделал возможным передачу массивов таким образом?
Каков вообще "правильный" способ передачи массивов структур между # и ++?
Сейчас мы пока решили эту проблему с помощью SAFEARRAY, все работает, но вопрос все равно остался.
Кроме того мнтересует производительность. Что будет быстрее SAFEARRAY или написанный маршаллер?
Здравствуйте, Lenikur, Вы писали:
L>На # этот номер не прошел. L>Ребята пишущие # компонент сказали что после обработки нашего tlb с помощью tlbimp они не могут расценивать это как массив.
L>Скажите пожалуйста, нельзя ли написать некий маршаллер который бы сделал возможным передачу массивов таким образом?
Если для получения интерфейса на стороне C# используется обычный tlbimp то, пространства для маневра практически не остается.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>Если для получения интерфейса на стороне C# используется обычный tlbimp то, пространства для маневра практически не остается.
Здравствуйте, Lenikur, Вы писали:
TK>>Если для получения интерфейса на стороне C# используется обычный tlbimp то, пространства для маневра практически не остается. L>А какие альтернативы есть?
Описать интерфейс руками
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Lenikur, Вы писали:
L>а как описанный руками интерфейс будет сопоставляться с интерфейсом описанным в IDL? По UID?
Конечно, все так же как и в COM
L>Идея такая:
L>IDL: interface I1; interface I2; I2 использует I1 и наоборот. L>C#: реализует I1 L>C++: реализует I2
L>правильно ли я понял, что ты говоришь об альтернативе, когда I1 кроме IDL описывается руками и в C#?
Да.
С другой стороны, может выйти проще написать набольшой враппер на C++/CLI для работы с данным COM объектом из C#
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>С другой стороны, может выйти проще написать набольшой враппер на C++/CLI для работы с данным COM объектом из C#
Таак.. с этого момента подробнее, если можно )).
C++/CLI — это managed C++?
Он правильно поймет генеренные MIDL-ом файлы? т.е., например, передачу указателя на 1 элемент массива?
А как на # работа с C++/CLI враппером будет выглядить?
Здравствуйте, Lenikur, Вы писали:
L>Таак.. с этого момента подробнее, если можно )). L>C++/CLI — это managed C++?
managed с++ был в VS 2003. Начиная с VS 2005 этот синтаксис стал "устаревшим" теперь оно называется C++/CLI
L>Он правильно поймет генеренные MIDL-ом файлы? т.е., например, передачу указателя на 1 элемент массива?
Оно будет понимать обычные *.h файлы.
L>А как на # работа с C++/CLI враппером будет выглядить?
Как с обычным .net классом. Идея простая — на C++/CLI пишется обычный managed класс который внутри работает напрямую с COM объектом используя обычный unmanaged код (меньше заморочек с маршаллингом данных и т.п.).
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>managed с++ был в VS 2003. Начиная с VS 2005 этот синтаксис стал "устаревшим" теперь оно называется C++/CLI TK>Оно будет понимать обычные *.h файлы. TK>Как с обычным .net классом. Идея простая — на C++/CLI пишется обычный managed класс который внутри работает напрямую с COM объектом используя обычный unmanaged код (меньше заморочек с маршаллингом данных и т.п.).
Спасибо. Обязательно попробуем. А не в курсе, насколько это распространенная практика такого взаимодействия?
Здравствуйте, Lenikur, Вы писали:
L>Спасибо. Обязательно попробуем. А не в курсе, насколько это распространенная практика такого взаимодействия?
Относительно распространенная. Вообще, все зависит от вашей ситуации. например, если нет COM маршаллинга то возможно, что проще передать какой-нибудь void* который на стороне C# банально закастить к нужной структуре
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.