用于C#COM自动化的双接口和仅调度接口之间的区别

Ime*_*lza 4 c# com-interop idispatch

我正在针对C++ COM服务器实现ac#COM客户端.当我将COM接口标记为"Dual"时,COM客户端正常运行,但是当我删除"Dual"属性时,它会抛出InvalidCastException.

因此,对我来说简单的方法是将其标记为Dual.但是从在线阅读来看,它似乎不是推荐的COM服务器使用方法.任何人都可以向我解释将界面标记为双重以及为什么不推荐它的重要性(以外行的术语)?

我只需要它用于测试目的,我正在使用C#客户端(不要以为我会使用VB)

或者,任何人都可以指出我为非双接口创建C#COM客户端的良好演练(MSDN上的示例都是双接口)谢谢!

Gre*_*her 5

当您为公共消费创建COM对象时,您可以使用不同的选项来使您的界面可供公共使用.

如果您只想使COM对象可用于支持指针和vtable等内容的低级编程语言(如C++,C,C#等),则可以创建一个继承自IUnknown的"自定义"接口.

这种方法的问题是您的COM对象不可用于脚本客户端(VBScript,JScript,WScript等),因为这些客户端不了解指针和vtable.相反,您将实现COM对象接口作为IDispatch的派生.IDispatch提供了一些方法,允许脚本客户端在运行时而不是编译时动态发现其方法和属性.但是,此过程的效率低于使用IUnknown,因为客户端必须在调用所需的COM对象方法之前进行额外的方法调用.

因此,如果您只针对低级编程语言,则可以使用继承自IUnknown的"自定义"接口来实现COM接口

如果您只是针对脚本客户端,则可以仅使用IDispatch实现接口.

如果您希望COM对象可用于脚本语言,并且您还希望低级语言能够以非常有效的方式调用您的方法,那么您应该实现两者,这称为"双重".可能微软的例子都是"双重",因为他们希望他们的例子能够兼容脚本和低级语言(低级语言可以使用IDispatch,但需要更多的工作).

有关详细信息,我建议您观看PluralSight.Net互操作性课程(您可以注册免费试用订阅).本课程的"COM"部分向您展示了如何创建非双(简单的IUnknown接口)以及"双"接口.