Как управлять параметрами создания COM-объекта .Net RCW (а именно запрашиваемым интерфейсом)? - PullRequest
0 голосов
/ 18 сентября 2011

Я использую внешний собственный COM-компонент в своем приложении на C # .Net.

Этот COM-dll не имеет библиотеки типов, поэтому мне пришлось самому писать код взаимодействия и иметь include / idlфайлы, которые я сделал, как это делает TlbImp.Но хуже всего то, что создание объекта завершилось неудачно с:

Создание экземпляра COM-компонента с CLSID {40700425-0080-11D2-851F-00C04FC21759} из IClassFactory не удалось из-за следующей ошибки: 80040111

Класс создается точно, если я использую собственный CoCreateInstance и указываю class_id и один из реализованных идентификаторов интерфейса.

Как оказалось, проблема заключается в IClassFactory этого COM-объекта:: CreateInstance не поддерживает IID_IUnknown, переданный как параметр riid, и поэтому возвращает CLASS_E_CLASSNOTAVAILABLE (я идентифицировал его с дизассемблером и отладчиком).Компонентом является MS SQL VDI.

Есть ли способ заставить .Net RCW передавать другой идентификатор интерфейса в метод CreateInstance, а не IID_IUnknown?Искал в сети много, но не нашел решения для этого.

В качестве обходного пути я сейчас использую C ++ / CLI для создания объекта с запросом соответствующего интерфейса вместо него, если IID_IUnknown.для этого сейчас, но хотелось бы иметь код на C #, потому что C ++ / CLI требует от меня создания разных DLL для каждой платформы.

Спасибо

1 Ответ

0 голосов
/ 18 сентября 2011

Я репро. Брр, больно. Вы можете вызвать CoCreateInstance:

[return: MarshalAs(UnmanagedType.Interface)]
[DllImport("ole32.dll", ExactSpelling=true, PreserveSig=false)]
public static extern object CoCreateInstance(ref Guid clsid, 
    [MarshalAs(UnmanagedType.Interface)] object punkOuter, int context, ref Guid iid);
...