我在c# . net应用程序中使用了一个外部的本机COM组件。
这个COM DLL没有类型库,所以我必须自己编写互操作代码,并且包含/idl文件,我像TlbImp那样做。但最糟糕的是对象创建失败:
Creating an instance of the COM component with CLSID {40700425-0080-11D2-851F-00C04FC21759} from the IClassFactory failed due to the following error: 80040111
如果我使用本机CoCreateInstance
并指定class_id
和实现的接口id之一,则最终创建了类。
事实证明,问题在于COM对象的IClassFactory::CreateInstance
不支持作为riid
参数传递的IID_IUnknown
,因此返回CLASS_E_CLASSNOTAVAILABLE
(我用反汇编器和调试器识别它)。该组件为MS SQL VDI。
有没有办法强制。net RCW传递一个不同的接口ID到CreateInstance
方法而不是IID_IUnknown
?我在网上搜索了很多,但没有找到解决这个问题的方法。
作为一个解决方案,我现在使用c++/CLI来创建对象,请求适当的接口而不是IID_IUnknown
用于这个目的;但是我想在c#中编写代码,因为c++/CLI要求我为每个平台构建不同的DLL。
谢谢
即痛苦。你可以调用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);