我在C#.Net应用程序中使用外部本机COM组件。
这个COM dll没有类型库,所以我不得不自己编写interop代码,并且我有像TlbImp那样的include / idl文件。 但最糟糕的是,对象创建失败了:
由于以下错误,从IClassFactory创建了具有CLSID {40700425-0080-11D2-851F-00C04FC21759}的COM组件实例失败:80040111
如果我使用本机CoCreateInstance并指定class_id和一个已实现的接口iid,则可以很好地创建该类。
事实证明,问题在于COM对象的IClassFactory :: CreateInstance不支持作为riid parametr传递的IID_IUnknown,因此返回CLASS_E_CLASSNOTAVAILABLE(我用反汇编程序和调试器识别它)。该组件是MS SQL VDI。
有没有办法强制.Net RCW将不同的接口ID传递给CreateInstance方法而不是IID_IUnknown? 搜索了很多网,但没有找到解决方案。
作为一种解决方法,我现在正在使用C ++ / CLI来处理对象请求正确的接口,如果IID_IUnknown。为了这个目的,但是想在C#中使用代码,因为C ++ / CLI要求我为每个平台构建不同的DLL。
由于
答案 0 :(得分:0)
我责备。布里尔,痛苦。你可以调用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);