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

2024-04-05

我正在针对 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(使用前将#替换为@)

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

随机推荐

  • wget ssl 警报握手失败

    我尝试从 https 站点下载文件并不断收到以下错误 OpenSSL error 14077410 SSL routines SSL23 GET SERVER HELLO sslv3 alert handshake failure Unab
  • 列出AWS S3存储桶中的所有对象

    我试图弄清楚如何在 Swift 中列出 AWS S3 存储桶中的所有对象 我似乎无法在互联网上的任何地方找到信息 但也许我看起来不够努力 如果有人可以向我推荐允许我执行此操作的代码 那就太好了 不知道你是否还需要它 但你可以 let cre
  • 如何在delphi 7中将unicode字符转换为ascii代码?

    是的 我们正在谈论 ASCII 代码 抱歉 我不是这里的 Delphi 开发人员 对于 Delphi 7 我会得到Mike Lischke 的免费 Unicode 库 http www soft gems net index php lib
  • 像#include 这样的预处理器指令只能放在程序代码的顶部吗?

    我已经用过 pragma函数内的指令没有错误或警告 特别是 pragma pack 但是下面的代码显示了警告incompatible implicit declaration of built in function printf int
  • 四人帮 - 设计模式 - 这些模式示例是否以过时的方式编码?

    所以为了澄清我的问题 臭名昭著的 GoF 书中的每个模式 设计模式 可重用的面向对象软件的元素 有 C 代码示例 这些是最新的吗 或者现在的 C 代码看起来有很大不同吗 我这么问是因为当我发布带有最后一个问题的代码时 许多 C 开发人员告诉
  • 九补丁与矢量图形

    我正在学习 Android UI 但不清楚为什么人们在可以使用矢量图形的情况下使用九个补丁 因为它们是可扩展的 不会出现任何像素退化 我是 Android 的初学者 所以我希望我在这里不会遗漏任何东西 但似乎构建矢量图形并使用它们会更容易
  • 为什么部分应用函数会延迟 Scala 中的类实例化?

    想象一下这段代码 class Foo println in Foo def foo a Int a 1 现在 如果我们调用 new Foo foo 将按预期创建 Foo 类的实例 in Foo res0 Int gt Int
  • Reactjs 地图函数不渲染组件

    这是错误 https i stack imgur com zmiR6 png我正在尝试渲染 createCardHotels 函数 但是 每当我运行它时 什么也没有显示 任何帮助将不胜感激 我使用地图函数来循环数据 每当我运行它时 我都可以
  • Android Studio找不到颜色样式资源

    我正在尝试使用自定义主题 AppCompat NoActionBar但是IDE throws无法找到指定资源的错误 请协助 任何帮助将不胜感激 styles xml如下
  • 网格对于 kernelUD /getverticeshr/adehabitatHR 家庭范围估计来说太小

    adehabitat HR 的文档建议使用以下代码来在创建 UD 对象后计算家庭范围的 95 内核 Calculation of the 95 percent home range ver lt getverticeshr ud 95 对于
  • 发送同步请求角度6 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想在 Angular 6 中发送这个嵌套 for 循环的同步请求 所有 for 循环都必须等待彼此响应 请举一些例子https stack
  • 如何访问iframe元素?

    当您像这样循环访问页面中的所有 iframe 时 HTML ul li li li li li li ul JS for var i 0 i lt window frames length i if window frames i getN
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • 如何获取两个日期之间的天数?

    我需要计算两个日期之间的天数 我已经检查了此链接给出的代码如何使用 JavaScript 计算两个日期之间的天数 https stackoverflow com questions 2627473 how to calculate the
  • 删除名为“NA”的列

    我正在处理一些 RNA seq 计数数据 其中大约有 60 000 列包含基因名称 24 行包含样本名称 当我进行一些基因名称转换时 我留下了一堆名为NA 我知道 R 可以处理NA与典型的列名称不同 我的问题是如何删除这些列 这是我的数据的
  • Chrome 无法获取选定的 html 字符串换行标签 (contenteditable)

    我在用着this https stackoverflow com a 6668159 1491124Tim Down 的解决方案在 contenteditable div 中获取选定的 html 并且工作正常 谢谢 Tim 但是使用 Chr
  • 显示 2 行消息弹出 vba 6

    有没有办法在 vba 6 的弹出窗口上显示 2 或 3 或 4 或 n 行消息 目前我的弹出窗口 调用 MsgBox 函数 显示如下消息 You did something wrong Please enter valid input 我希
  • ES6 箭头函数和 Promise Chaining 精简语法解释

    在下面的代码块中 有人可以提供压缩警报语句语法的链接或解释吗 我理解前面的扩展等效代码已被注释掉并包含消息参数 但是 我找不到省略消息参数的语法参考 let timeoutPromise new Promise resolve reject
  • Pycharm不显示结果

    Pycharm不显示结果 进程已完成 退出代码为 1 但是当我调试它的工作并显示警告时 Debugger speedups using cython not found Run C Python27 python exe C Program
  • C# COM 自动化的双接口和仅调度接口之间的区别

    我正在针对 C COM 服务器实现一个 C COM 客户端 当我将 COM 接口标记为 Dual 时 COM 客户端可以正常工作 但当我删除 Dual 属性时 它会抛出 InvalidCastException 因此 对我来说最简单的解决方