Как проверить во время выполнения, какой COM-класс COM был использован для создания экземпляра интерфейса?

Предположим, у вас есть интерфейс COM ICOMInterface это реализовано Coclasses Coclass1 а также Coclass2, Ни у одного из этих классов нет собственных интерфейсов (для простоты и для иллюстрации моей проблемы).

В C# вы можете создать экземпляр интерфейса COM из кокласса следующим образом:

ICOMInterface myComInterface = new Coclass1();

Теперь, как вы можете определить, myComInterface был создан Coclass1 или же Coclass2?

Использование оператора "is", как следует, всегда возвращает истину, и как таковое для этой цели бесполезно.

Debug.WriteLine(myComInterface is Coclass1) // writes "True"
Debug.WriteLine(myComInterface is Coclass2) // writes "True"

Это сработало бы, если бы я тестировал интерфейсы, а не коклассы, но у этих коклассов нет интерфейсов, отличных от того, который они оба реализуют, ICOMInterface,

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

Спасибо за вашу помощь!

1 ответ

Решение

Если COM-объект реализует интерфейс IPersist, вы можете получить его CLSID через IPersist::GetClassID() метод. Это может быть все, что вам нужно знать, с каким классом вы работаете. Вы также можете получить удобочитаемый ProgID через WinAPI ProgIDFromCLSID() метод.

Смотрите здесь: C# Получить ProgID из COM-объекта

Другие вопросы по тегам