1

我在我的 C# .NET 应用程序中使用外部本机 COM 组件。

这个 COM DLL 没有类型库,所以我必须自己编写互操作代码,并且拥有 include/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实现的接口 IID 之一,则最终创建该类。

事实证明,问题在于 COM 对象IClassFactory::CreateInstance不支持IID_IUnknown作为参数传递riid,因此返回CLASS_E_CLASSNOTAVAILABLE(我用反汇编器和调试器识别它)。该组件是 MS SQL VDI。

有什么方法可以强制 .NET RCW 将不同的接口 ID 传递给CreateInstance方法而不是IID_IUnknown? 我在网上搜索了很多,但没有找到解决方案。

作为一种解决方法,我现在使用 C++/CLI 来创建对象,请求正确的接口而不是IID_IUnknown现在用于此目的;但我想用 C# 编写代码,因为 C++/CLI 要求我为每个平台构建不同的 DLL。

谢谢

4

1 回答 1

2

我复制。呸,痛。您可以调用 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);
于 2011-09-18T19:38:35.050 回答