DebuggerEvents.OnEnterBreakMode在Visual Studio扩展包中没有被触发

本文关键字:包中没 扩展 OnEnterBreakMode Visual Studio DebuggerEvents | 更新日期: 2023-09-27 17:51:19

我写了一个订阅DebuggerEvents的visual studio扩展包。OnEnterBreakMode事件。但是这个事件永远不会被触发。

下面是一些代码:
protected override void Initialize()
    {
        base.Initialize();
        applicationObject = (DTE2) GetService(typeof (DTE));
        applicationObject.Events.BuildEvents.OnBuildDone += BuildEventsOnOnBuildDone;
        applicationObject.Events.DebuggerEvents.OnEnterBreakMode += DebuggerEventsOnOnEnterBreakMode;
    }

但是方法DebuggerEventsOnOnEnterBreakMode从未被调用。方法BuildEventsOnOnBuildDone被调用

为什么会发生这种情况?

DebuggerEvents.OnEnterBreakMode在Visual Studio扩展包中没有被触发

我知道这听起来很傻,但是为了听DebuggerEvents事件,您需要维护对DebuggerEvent s本身的引用。

DebuggerEvents _debuggerEvents;
protected override void Initialize() {
  applicationObject = (DTE2) GetService(typeof (DTE));
  _debuggerEvents = applicationObject.Events.DebuggerEvents;
  _debuggerEvents.OnEnterBreakMode += DebuggerEventsOnOnEnterBreakMode

原因很微妙。DebuggerEvents实际上是一个COM/CCW对象,它是在访问DTE.DebuggerEvents属性时按需创建的。事件处理程序代码不会使CCW保持活动状态,因此下一个GC可能会收集DebuggerEvents属性并带走事件处理程序。

这是一个非常奇怪的bug,特定于CCW和事件。我听说它被称为"有史以来最烦人的虫子",这与事实相差不远