C#COM自动化的双接口和仅调度接口的区别 我正在对C++ COM服务器实现一个Cycom客户端。当我将COM接口标记为“Dual”时,COM客户端可以正常工作,但当我删除“Dual”属性时,它会抛出InvalidCastException

C#COM自动化的双接口和仅调度接口的区别 我正在对C++ COM服务器实现一个Cycom客户端。当我将COM接口标记为“Dual”时,COM客户端可以正常工作,但当我删除“Dual”属性时,它会抛出InvalidCastException,c#,com-interop,idispatch,C#,Com Interop,Idispatch,因此,对我来说,简单的解决方法是将其标记为对偶。但从在线阅读来看,这似乎不是COM服务器推荐使用的方法。有人能向我解释一下将接口标记为双接口的重要性(用外行术语)以及为什么不建议这样做吗 我只是出于测试目的才需要它,而且我正在使用C#client(别指望我会使用VB) 或者,有谁能告诉我一个关于为非双接口(MSDN上的示例都是双接口)创建C#COM客户端的好演练吗?谢谢 创建供公众使用的COM对象时,对于如何使接口可供公众使用,您有不同的选项 如果您只想让COM对象可以用于支持指针和VTABLE

因此,对我来说,简单的解决方法是将其标记为对偶。但从在线阅读来看,这似乎不是COM服务器推荐使用的方法。有人能向我解释一下将接口标记为双接口的重要性(用外行术语)以及为什么不建议这样做吗

我只是出于测试目的才需要它,而且我正在使用C#client(别指望我会使用VB)


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

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

<>如果您只想让COM对象可以用于支持指针和VTABLE之类的低级编程语言(如C++、C、C等),您可以创建一个“自定义”接口,该接口继承了iNo../P> 这种方法的问题是,COM对象将不可用于脚本客户端(VBScript、JScript、WScript等),因为这些客户端不理解指针和vtables。相反,您可以将COM对象接口实现为IDispatch的派生。IDispatch提供了一些方法,允许脚本客户端在运行时而不是编译时动态发现其方法和属性。但是,此过程的效率不如使用IUnknown,因为客户端必须在调用所需COM对象的方法之前进行额外的方法调用

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

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

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


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

旁注:我个人认为“我只需要它用于测试目的”并不是通过COM公开C#/.Net对象的令人信服的理由。。。这不是一个微不足道的功能/安装/-