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

本文关键字:接口 调度 之间 区别 COM 自动化 | 更新日期: 2023-09-27 18:30:55

我正在针对C++ COM服务器实现一个c# COM客户端。当我将 COM 接口标记为"Dual"时,COM 客户端运行正常,但在删除"Dual"属性时,它会引发 InvalidCastException。

因此,对我来说,简单的解决方法是将其标记为双。但是从在线阅读来看,它似乎不是用于COM服务器的推荐方法。谁能向我解释一下将接口标记为双接口的重要性(通俗地说)以及为什么不推荐它?

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

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

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

创建供公共使用的 COM 对象时,对于如何使接口可供公共使用,有不同的选项。

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

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

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

如果仅面向脚本客户端,则可以仅使用 IDispatch 实现接口。

如果您希望 COM 对象可用于脚本语言,并且还希望低级语言能够以非常有效的方式调用您的方法,则应同时实现两者,这称为"Dual"。 可能,Microsoft 的示例都是"双重的",因为他们希望他们的示例同时适用于脚本和低级语言(低级语言可以使用 IDispatch,但这需要更多的工作)。

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