Как COM связан с C Sharp при преобразовании кода VC ++ (который включает в себя концепции COM) в C #? - PullRequest
1 голос
/ 10 ноября 2010

У меня есть хорошие знания в C Sharp и C ++. Но я совершенно новичок в программировании COM. Я конвертирую код из VC ++ в C #. Но код VC ++ включает в себя множество ключевых слов COM, таких как STDMETHODIMP , STDMETHODCALLTYPE , __declspec , HRESULT и других концепций программирования COM. Я не понял, что это за терминология COM. Но так как я могу понимать C ++, я могу понять логику кода VC ++ и преобразовать эту логику в реализацию C #, игнорируя терминологию COM.
Некоторые функции в моем коде VC ++ имеют возвращаемый тип STDMETHODIMP , и они просто возвращают S_OK или E_FAIL и т. Д. Как будет продолжаться мое преобразование в C Sharp ? Что я должен вернуть в своем коде C # для этих функций VC ++, которые возвращают S_OK E_FAIL, и какой тип возврата я должен использовать в своем коде C # вместо STDMETHODIMP. ? На самом деле в моем коде VC ++ есть много таких терминов COM, как "skippedEntity ()", processingInstruction () "и т. Д. Фактически этот код VC ++ использует библиотеку DLL с именем" msxml6.dll ". И реализуя в нем методы интерфейса. Итак, это нормально, если я игнорирую эти терминологии COM и продолжаю реализовывать логику, включенную в код VC ++, в C #.
Пожалуйста, дайте мне знать то же самое.

Поскольку COM для меня является концепцией пришельцев, извините, если я задаю какое-то глупое сомнение или бессмысленное сомнение ..

Заранее спасибо ..

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Идентификаторы в верхнем регистре являются макросами, они гарантируют, что функция интерфейса COM имеет правильную подпись.Функция COM, совместимая с автоматизацией, должна использовать правильное соглашение о вызовах __stdcall и должна возвращать long (hresult), который указывает на ошибку или статус успеха.Дополнительные требования заключаются в том, что интерфейс COM должен реализовывать IUnknown, а типы аргументов функции должны ограничиваться типами, совместимыми с автоматизацией.

Поддержка взаимодействия COM в CLR обеспечивает выполнение этих требований.Он генерирует v-таблицу для интерфейса C #, который автоматически реализует IUnknown, вам не нужно реализовывать его самостоятельно.Возвращаемое значение HRESULT генерируется автоматически, оно сопоставляется с исключением.Аргументы функций автоматически маршалируются из их неуправляемого типа в эквивалентный нативный тип.

Перевод типа аргумента является довольно большой темой и описан в любой приличной книге на эту тему (например, Адам Натан).Достаточно сказать, что любой совместимый с автоматизацией тип имеет соответствующий управляемый тип.Более сложные объекты - это объект VARIANT, строка BSTR и массив SAFEARRAY.

Вы используете атрибут [ComVisible] в C # для создания COM-сервера.Несколько других имеют отношение, например, [Guid] и [InterfaceType].Это хорошо освещено в любых примерах.Вы создаете библиотеку типов с помощью Tlbexp.exe или, чаще, с помощью Regasm.exe / tlb.Последний инструмент - тот, который требуется для регистрации сервера, вы больше не можете использовать Regsvr32.exe.

0 голосов
/ 10 ноября 2010

Большая часть этого материала обрабатывается автоматически, если вы добавляете ком-ссылку в свой проект (или импортируете с помощью TLBIMP).

S_OK и S_FAIL преобразуются в исключения.См. MSDN .

...