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