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

vmg*_*vmg 1 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;
    }
Run Code Online (Sandbox Code Playgroud)

但方法DebuggerEventsOnOnEnterBreakMode永远不会被调用.BuildEventsOnOnBuildDone调用方法.

为什么会这样?

Jar*_*Par 7

我知道这听起来很傻但是为了听取DebuggerEvents你需要的事件来保持对DebuggerEvents本身的引用.

DebuggerEvents _debuggerEvents;

protected override void Initialize() {
  applicationObject = (DTE2) GetService(typeof (DTE));

  _debuggerEvents = applicationObject.Events.DebuggerEvents;
  _debuggerEvents.OnEnterBreakMode += DebuggerEventsOnOnEnterBreakMode
Run Code Online (Sandbox Code Playgroud)

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

这是一个非常奇怪的错误,特定于CCW和事件.我听说它被称为"有史以来最令人烦恼的错误",它与事实并不遥远