我正在针对 C++ COM 服务器实现一个 C# COM 客户端。当我将 COM 接口标记为“Dual”时,COM 客户端可以正常工作,但当我删除“Dual”属性时,它会抛出 InvalidCastException。
因此,对我来说最简单的解决方法是将其标记为 Dual。但从网上阅读来看,这似乎不是推荐用于 COM 服务器的方法。任何人都可以向我解释将接口标记为双重的重要性(用外行术语)以及为什么不推荐它?
我只需要它用于测试目的,并且我正在使用 C# 客户端(不要预期我会使用 VB)
或者,任何人都可以向我指出有关为非双接口创建 C# COM 客户端的良好演练(MSDN 上的示例都是双接口)谢谢!
当您创建供公共使用的 COM 对象时,对于如何使您的接口可供公共使用,您有不同的选择。
如果您只想使 COM 对象可用于支持指针和 vtable 等内容的低级编程语言(如 C++、C、C# 等),您可以创建一个继承自 IUnknown 的“自定义”接口。
这种方法的问题是您的 COM 对象将不可用于脚本客户端(VBScript、JScript、WScript 等),因为这些客户端不理解指针和 vtable。相反,您可以将 COM 对象接口实现为 IDispatch 的派生。 IDispatch 提供了一些方法,允许脚本客户端在运行时而不是编译时动态发现其方法和属性。但是,此过程的效率低于使用 IUnknown,因为客户端必须在调用所需 COM 对象的方法之前进行额外的方法调用。
因此,如果您仅针对低级编程语言,则可以使用继承自 IUnknown 的“自定义”接口来实现 COM 接口
如果您仅针对脚本客户端,则可以仅使用 IDispatch 来实现您的接口。
如果您希望脚本语言可以使用 COM 对象,并且还希望低级语言能够以非常快的方式调用您的方法高效的方式,你应该同时实现,这就是所谓的“双重”。也许,微软的例子都是“双重”的,因为他们希望他们的例子能够同时使用脚本和低级语言(低级语言可以使用IDispatch,但需要更多的工作)。
欲了解更多信息,我建议您观看PluralSight 的 .Net 互操作性课程 https://app.pluralsight.com/library/courses/dotnet-interoperability-fundamentals/discussion(您可以注册免费试用订阅)。本课程的“COM”部分向您展示如何创建非 Dual(简单的 IUnknown 接口)以及“Dual”接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)