如何管理 .Net的RCW COM对象创建参数(即请求的接口)?



我在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);

相关内容

  • 没有找到相关文章

最新更新