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

时间:2011-09-18 18:43:08

标签: com interop createinstance rcw iunknown

我在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。

由于

1 个答案:

答案 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);