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

如何管理.Net';s RCW COM对象创建参数(即请求的接口)?,com,interop,createinstance,rcw,iunknown,Com,Interop,Createinstance,Rcw,Iunknown,我正在C#.Net应用程序中使用外部本机COM组件 这个COM dll没有类型库,所以我必须自己编写互操作代码,并且像TlbImp一样使用include/idl文件。 但最糟糕的是,对象创建失败: 由于以下错误,从IClassFactory创建CLSID为{40700425-0080-11D2-851F-00C04FC21759}的COM组件实例失败:80040111 如果我使用本机CoCreateInstance并指定class_id和一个实现的接口IID,则可以很好地创建该类 事实证明,问题

我正在C#.Net应用程序中使用外部本机COM组件

这个COM dll没有类型库,所以我必须自己编写互操作代码,并且像TlbImp一样使用include/idl文件。 但最糟糕的是,对象创建失败:

由于以下错误,从IClassFactory创建CLSID为{40700425-0080-11D2-851F-00C04FC21759}的COM组件实例失败:80040111

如果我使用本机CoCreateInstance并指定class_id和一个实现的接口IID,则可以很好地创建该类

事实证明,问题在于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


谢谢

我再重复一遍。Brr,很痛。您可以使用pinvoke 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);

未能从CoCreateInstance()响应IUnknown是一个错误。您能让外部库的所有者修复它吗?所有者是微软,由于这个漏洞已经存在了10多年,并且考虑到它不会阻止组件的使用,我认为补丁不会可用。谢谢你的建议,汉斯。它做到了,简单的说唱歌手会把它隐藏起来。虽然有这样的东西会很好(编辑——上帝,如何在评论中发布换行?回车和点击保存按钮)。。。类似于:[DefaultInterfaceGuid(“XXXX-XXX-XXX”)]之类的内容。