COM-взаимодействие x86 из сборки x64 .Net с использованием COM + - ошибка «Такой интерфейс не поддерживается» - PullRequest
0 голосов
/ 04 марта 2012

Я пишу сборку C #, которая вызывается из процесса x64 (SS Reporting Services) и должна использовать стороннюю сборку COM x86.

Когда я компилирую свою сборку как x64, я получаю исключение COM "Класс не зарегистрирован", как только сделан первый вызов к сборке COM.

Следуя совету здесь (извините, если моя терминология неверна) Я создал новое приложение COM + и добавил компоненты, найденные в сборке COM, на которую я ссылаюсь. Когда я запускаю свою сборку как x64, она делает несколько успешных вызовов COM-сборки, пока не получит эту ошибку:

Невозможно привести объект COM типа «TRIMSDK.RecordTypesClass» к типу интерфейса «TRIMSDK.IBaseObjects». Эта операция завершилась неудачно, поскольку вызов QueryInterface в компоненте COM для интерфейса с IID '{8A354545-6BCB-11D3-B273-00A0C9FC3DC0}' завершился ошибкой из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

'TRIMSDK.RecordTypesClass' реализует 'TRIMSDK.IBaseObjects' в соответствии с определением класса.

Если я ищу в реестре идентификатор GUID интерфейса из сообщения об ошибке или «IBaseObjects», совпадений не найдено. После создания приложения COM + я получаю ту же ошибку в режиме x86 (что, я думаю, имеет смысл), хотя до этого все работало нормально в x86.

Итак, я предполагаю, что интерфейс «TRIMSDK.IBaseObjects», который я пытаюсь использовать, не регистрируется как штука COM +, и я не знаю, почему или как это исправить.

Есть идеи? Заранее спасибо.

Обновление: Я думаю, что получаю исключение E_NOINTERFACE для TRIMSDK.IBaseObjects, потому что атрибут TypeLibType в интерфейсе установлен только на «FNonExtensible», тогда как другие интерфейсы, которые я успешно использую в сборке, также имеют « FDispatchable. Можно ли обойти эту ошибку (либо изменяя библиотеку типов, либо вручную регистрируя интерфейс 'IBaseObjects')?

1 Ответ

0 голосов
/ 06 ноября 2012

Это довольно старый вопрос, но я только разобрался с этим в нашей среде после того, как некоторое время боролся с этой проблемой.У меня очень мало опыта работы с COM и / или Interop, поэтому извините, если моя терминология немного не подходит.

Сообщение об ошибке, которое я получал, было:

Невозможно привести объект COM типа 'TYSTransfer.TransferClass' к типу интерфейса 'TYSTransfer._Transfer'.Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{ E825C39B-1EF3-4319-89FC-AEF62C8117B9 }' завершился ошибкой из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).

Я также пытался найти GUID интерфейса, указанный в сообщении.Я искал в службах компонентов идентификатор GUID, назначенный нашему COM-компоненту, и мог видеть:

GUID that component services showed

Затем, когда я использовал DotPeek , чтобы посмотреть на сгенерированный класс Interopчто я использовал для доступа к этому COM-компоненту, я заметил, что связанный GUID для того же интерфейса был тем, о котором сообщалось в моей ошибке;

DotPeek data of the same interface

Так DotPeek показал мне, чтоссылка на Guid была из моего класса Interop.Оказалось, что при восстановлении класса Interop против целевого COM-объекта был создан класс с правильными Guids (по крайней мере, они соответствовали, так что я предположил, что они были правильными), и использование этого исправило проблему для нас.

...