Visual Studio扩展包中未触发DebuggerEvents.OnEnterBreakMode

时间:2014-03-21 21:47:40

标签: c# visual-studio visual-studio-debugging visual-studio-extensions

我写了一个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

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:6)

我知道这听起来很愚蠢但是为了听取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和事件。我听说过它是有史以来最令人烦恼的错误"它离真相不远