Можно ли устранить неполадки в реализации интерфейса C # COM? - PullRequest
0 голосов
/ 14 января 2010

У меня есть реализация C # COM-интерфейса C ++. Я перенес IDL (интерфейс) настолько точно, насколько смог.

Когда приложение C ++ создает экземпляр моего объекта, оно успешно вызывает один из методов. Затем он пытается вызвать другой метод, но ничего не происходит. Путь выполнения второго вызова никогда не переходит на сторону C #.

У меня нет доступа к C ++ exe-коду. У меня есть рабочая скомпилированная C ++ версия COM DLL объекта с кодом. Это то, что я пытаюсь заменить в C #.

Что я могу использовать для сравнения интерфейсов C ++ COM и C # COM DLL, чтобы увидеть, есть ли различия? Это вообще возможно? Я пробовал OLE View от Microsoft, но он не может открыть C ++ DLL. Я думаю, что если я увижу, что моя DLL выглядит точно так же, как C ++, она может работать.

Этот вопрос больше о том, как помочь мне понять, куда я могу пойти отсюда. Я задал очень подробный вопрос о точной реализации, которую я пытаюсь достичь, но никто не заинтересован. Вот почему я публикую более общий вопрос, который поможет мне найти ответ.

Я действительно застрял. 25+ часов ушло на это уже хе.

Ответы [ 3 ]

0 голосов
/ 15 января 2010

Не думаю, что вы могли бы написать собственное тестовое приложение (C ++ или C # или оба) для работы вашей реализации C # и посмотреть, что происходит? Не стесняйтесь игнорировать, если вы уже сделали это.

0 голосов
/ 18 января 2010

После решения проблемы совместимости я обнаружил, что C ++ dll не предоставляет ожидаемые элементы интерфейса. Хотя этот вопрос был направлен на то, как отлаживать или сравнивать открытые интерфейсы двух библиотек, мой проект работал с использованием атрибута [ComImport] на реализуемых мной интерфейсах C #, а не [ComVisible (true)]. Я использовал атрибут [PreserveSig] в объявлениях интерфейса для обеспечения совместимости. Это мое понимание происходящего.

0 голосов
/ 15 января 2010

Вы пометили интерфейс C # InterfaceTypeAttribute, чтобы сообщить CLR, что он должен маршалировать его как IUnknown или как IDispatch?

Потому что, если вы этого не сделаете, ваши слоты методов в VMT будут испорчены.

...