首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# COM自动化中双接口和调度接口的区别

问C# COM自动化中双接口和调度接口的区别
EN

Stack Overflow用户
提问于 2013-09-10 22:02:06
回答 1查看 1.4K关注 0票数 5

我将在c# COM服务器上实现C++ COM客户端。当我将COM接口标记为"Dual“时,COM客户端将正确运行,但当我删除"Dual”属性时,它将抛出一个InvalidCastException。

因此,对我来说,简单的解决办法是把它标记为双重的。但从在线阅读来看,它似乎不是COM服务器使用的推荐方法。有谁能向我解释一下(用非专业术语)将界面标记为双面的意义,以及为什么不推荐它?

我只需要它进行测试,而且我使用的是C#客户端(不要预期我会使用VB)

或者,有人能告诉我关于为非双接口创建C# COM客户端的一个很好的演练( MSDN上的示例都是双接口)谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-06-05 22:10:27

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

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

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

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

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

如果您希望您的COM对象可供脚本语言使用,并且您还希望低级别语言能够以非常高效的方式调用您的方法,那么您应该实现这两种方法,这就是所谓的“双重”。也许,微软的例子都是“双重”的,因为他们希望他们的示例同时使用脚本语言和低级语言(低级语言可以使用IDispatch,但这需要更多的工作)。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18729489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档