【发布时间】:2016-10-08 12:01:38
【问题描述】:
我在 MSDN 上阅读了这篇文章, How to: Handle Events Raised by a COM Source.
它通过说明为 COM 事件源自动生成事件处理程序来简要描述 COM 事件处理的内部工作。我一直在尝试查找有关自动生成的内容的详细信息。
真的,我想知道何时调用 IConnectionPoint::Advise method。例如,在第一篇文章中,m_IExplorer.TitleChange += DTitleChangeE; 被调用时会调用它吗?据我了解,这是客户端上最终调用 COM 对象的 Advise() 的方法。
有没有 COM 专家可以澄清我的困惑?
编辑:我读了这篇文章.NET Delegate Event Model vs COM Connection Points。
在其中,作者指出Effectively, what you are doing here is something that's analogous to the IConnectionPoint::Advise in the COM world 参考
m_pager.OnAirlineArrivedEvent +=
new _IAirlineArrivalPagerEvents_OnAirlineArrivedEventEventHandler(OnMyPagerNotify);
不应该就是正在发生的事情吗? .Net 在 COM 接口的 COM 连接点上生成调用 IConnectionPoint::Advise 的“+=”操作?
【问题讨论】:
-
您混淆了客户端和服务器角色。调用 Advise() 来订阅您公开的事件的是客户端。当您在 ComVisible 类中使用 [ComSourceInterfaces] 属性时,是 CLR 提供 IConnectionPoint 实现。如果您编写的代码使用 COM 服务器,那么您就是客户端,那么 += 会到达 CLR 以调用 Advise()。
-
我看到我的第三段措辞相当奇怪。我知道客户调用了建议方法。我想知道的是 CLR 提供的用于与 COM 对象交互的 += 运算符的底层发生了什么。 .Net 客户端调用“+=”,我希望最终调用 Advise()。但是,我找不到描述 "+=" 实现的 MSDN 源
-
参会代表就像是铅做的冰山,你只能看到很尖的顶部。 CLR 中有大量的 C++ 代码来处理它们的实现。您必须阅读 coreclr 源代码才能看到。