Я использую внешний собственный компонент COM в моем приложении C # .Net.
В этой COM-dll нет библиотеки типов, поэтому мне пришлось самому написать код взаимодействия, и, имея файлы include / idl, я сделал это, как и TlbImp. Но хуже всего то, что создание объекта завершается ошибкой:
Создание экземпляра COM-компонента с CLSID {40700425-0080-11D2-851F-00C04FC21759} из IClassFactory не удалось из-за следующей ошибки: 80040111
Класс создается точно, если я использую собственный CoCreateInstance и указываю class_id и один из реализованных идентификаторов интерфейса.
Как оказалось, проблема заключается в том, что IClassFactory :: CreateInstance COM-объекта не поддерживает IID_IUnknown, переданный как параметр riid, и поэтому возвращает CLASS_E_CLASSNOTAVAILABLE (я идентифицировал это с помощью дизассемблера и отладчика). Компонент - MS SQL VDI.
Есть ли способ заставить .Net RCW передавать другой идентификатор интерфейса в метод CreateInstance, а не в IID_IUnknown? Много искал в сети, но не нашел решения для тысяч.
В качестве обходного пути я сейчас использую C ++ / CLI для создания объекта с запросом правильного интерфейса вместо IID_IUnknown. для этой цели сейчас, но хотелось бы иметь код на C #, потому что C ++ / CLI требует, чтобы я создавал разные DLL для каждой платформы.
Спасибо