4

我想向 COM 公开一个 .NET 类。这很容易:

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

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

  • 一个定义常规方法和属性的接口ComVisible
  • 另一个定义应该是事件的接口ComVisible

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

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

这背后的原因是什么?

4

2 回答 2

5

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

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

于 2009-12-31T14:39:08.607 回答
1

事件总是在单独的接口上定义。这不是 .NET 实现的 COM 接口所独有的,而是所有 COM 接口所独有的。在我看来,接口表示方法和属性的集合,但事件接口上的方法不会像其中任何一个那样被调用。它们由服务器而不是客户端调用,这与正常方法的行为不匹配。因此,通过在单独的接口上实现这些方法,您可以将服务器可以调用的功能与客户端可以调用的方法分开。客户端不应该能够调用事件方法。应该要求在服务器可以调用的对象上实现接口。同样,客户端不应实现已在服务器中实现的接口。它应该调用在服务器中实现的那些接口的现有实现。处理这个问题的最简单方法是为客户端提供一个接口来实现事件处理,另一个由服务器实现,客户端可以调用已经实现的功能。

于 2009-12-31T14:33:07.673 回答