我编写了一个Visual Studio扩展程序包,该程序包订阅DebuggerEvents.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事件,您需要维护对DebuggerEvent本身的引用。

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属性并将其与事件处理程序一起使用。

这是CCW和事件特有的非常奇怪的错误。我听说它被称为“有史以来最令人烦恼的错误”,与事实相距不远

关于c# - 在Visual Studio扩展程序包中未触发DebuggerEvents.OnEnterBreakMode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22570121/

10-10 15:35