gpt4 book ai didi

c# - 向 COM 公开 .NET 类(具有事件)

转载 作者:太空狗 更新时间:2023-10-30 01:11:40 25 4
gpt4 key购买 nike

我想向 COM 公开一个 .NET 类。这相当简单:

  • 我创建了一个接口(interface),我在其中定义了应该是 ComVisible 的类的成员
  • 我自己定义这些成员的 DispId
  • 我定义界面应该是ComVisible
  • 我为该接口(interface)分配了一个 Guid
  • 我创建了一个实现该接口(interface)的类

没什么大不了的。这一切都有效。但是,现在我的问题是:我在那个类中有一些事件,我也想公开给 COM。
这应该也没什么大不了的,但是,当我查看一些示例(例如 MS 的 ComInterop 工具生成的代码)时,我看到事件是在单独的接口(interface)中声明的。即:应该是 ComVisible 的类,实现了 2 个接口(interface):

  • 一个接口(interface),它定义了应该是 ComVisible
  • 的常规方法和属性
  • 定义事件的另一个接口(interface)应该是 ComVisible

现在,我的问题是:这是为什么?这是什么原因?

为什么 ComVisible 事件在另一个接口(interface)中定义,为什么它们没有在包含应为 ComVisible 的方法和属性的接口(interface)中定义?

这背后的原因是什么?

最佳答案

这是由于 COM 事件的工作方式所致。 COM 不知道委托(delegate)是什么,因此它的事件是使用回调接口(interface)实现的。希望接收事件的对象实现事件接口(interface),将其传递给发送者(您的代码),发送者调用它的方法。事件接口(interface)因此是独立的,因为您不希望对您的事件感兴趣的人必须实现接口(interface)的其余部分。

在幕后,事件接口(interface)使用“连接点”进行管理,允许接收者将他们的回调接口(interface)连接到发送者。此实现需要各种 COM 接口(interface)(IConnectionPoint、IConnectionPointContainer、IEnumConnectionPoints、IEnumConnections)和一些繁琐的内务处理。例如,如果您正在实现 COM 事件原生 C++,你必须关心这些接口(interface)。幸运的是,作为 .NET 程序员,您不必实现它们,因为 .NET 会为您完成。

关于c# - 向 COM 公开 .NET 类(具有事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1985451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com