将.NET类(具有事件)暴露给COM

时间:2009-12-31 13:39:26

标签: c# .net com comvisible

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

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

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

  • 一个接口,用于定义应该为ComVisible
  • 的常规方法和属性
  • 另一个界面,用于定义应为ComVisible的事件。

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

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

这背后的原因是什么?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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