5

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

因此,对我来说最简单的解决方法是将其标记为 Dual。但从网上阅读来看,这似乎不是用于 COM 服务器的推荐方法。谁能向我解释将接口标记为双重的重要性(用外行术语)以及为什么不推荐它?

我只需要它来进行测试,而且我正在使用 C# 客户端(不要指望我会使用 VB)

或者,谁能指出我为非双接口创建 C# COM 客户端的一个很好的演练(MSDN 上的示例都是双接口)谢谢!

4

1 回答 1

6

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

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

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

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

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

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

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

于 2016-06-05T22:10:27.567 回答