代码之家  ›  专栏  ›  技术社区  ›  Frederik Gheysels

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

  •  4
  • Frederik Gheysels  · 技术社区  · 15 年前

    我想向COM公开.NET类。 这相当容易:

    • 我在其中创建了一个接口,在该接口中我定义了类中应该是ComVisible的成员
    • 我自己定义那些成员的反差
    • 我定义接口应该是 ComVisible
    • 我指派一个 Guid 到那个接口
    • 我创建了一个实现该接口的类

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

    • 一个定义常规方法和属性的接口 可看见的
    • 定义事件的另一个接口 可看见的 .

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

    为什么是 可看见的 在另一个接口中定义的事件,以及为什么不在包含应为 可看见的 ?

    这背后的原因是什么?

    2 回复  |  直到 8 年前
        1
  •  5
  •   El Zorko    15 年前

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

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

        2
  •  0
  •   BlueMonkMN    15 年前

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

    推荐文章