COM到.NET互操作性

时间:2010-09-08 13:25:12

标签: c# .net com interop

如果您想在 C#代码中使用COM类型,那么这个过程很简单,对吧?您只需要使用类型库导入器,这很好,但如果您没有,那么您无法查看 IDL 文件?你只有COM DLL服务器。

例如,尝试使用IActiveDesktop界面。

用于解决此类问题的approch是什么?

1 个答案:

答案 0 :(得分:2)

有两种COM接口。您熟悉的是那些将自己局限于COM规范的子集,称为“OLE自动化”。在该术语之前也称为ActiveX与安全灾难相关联。

自动化兼容接口易于使用几乎任何语言。它们通常继承自IDispatch,允许从脚本语言中使用它们。并限制自己仅使用自动化兼容类型作为其方法参数。简单的东西,可与.NET值类型相媲美,BSTR表示字符串,SAFEARRAY表示数组,VARIANT表示无类型参数,与.NET的System.Object非常相似。

他们支持的另一个功能是类型库,相当于.NET元数据。由编译器用来知道如何调用接口方法。 IDE使用类型库自动生成互操作库,以便您可以直接创建包装类并从.NET代码中调用方法。

嗯,这是个好消息。坏消息是有很多COM接口不使用自动化限制。它们通常继承自IUnknown并使用不能编组的函数参数。像结构一样。 Windows中一个非常大且可见的组件就是shell。 Windows资源管理器。

这也是IActiveDesktop适合的地方,它是一个shell接口,继承自IUnknown。它在ShlObj.h SDK头文件中声明,甚至没有它的IDL文件。因此无法获得具有其定义的类型库。它使用不兼容的参数类型,如LPCWSTR(指向字符串的原始指针)而不是BSTR。和结构指针如LPCCOMPONENT和LPWALLPAPEROPT。 CLR互操作支持无法正确编组。

在C#中使用接口在技术上并非不可能,但您必须重新声明接口。非常小心,做错了很容易做到。已经做到这一点的源代码很难找到的事实暗示它有多难。这完全属于“不是不可能的,但是理智的程序员想要维护像这样的代码”。 shell是非托管C ++代码的域。还有一群耐心的程序员,因为调试shell扩展非常痛苦。