Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio扩展包中未触发DebuggerEvents.OneInterBreakMode_C#_Visual Studio_Visual Studio Debugging_Visual Studio Extensions - Fatal编程技术网

C# Visual Studio扩展包中未触发DebuggerEvents.OneInterBreakMode

C# Visual Studio扩展包中未触发DebuggerEvents.OneInterBreakMode,c#,visual-studio,visual-studio-debugging,visual-studio-extensions,C#,Visual Studio,Visual Studio Debugging,Visual Studio Extensions,我编写了一个visual studio扩展包,订阅DebuggerEvents.OneInterBreakMode事件。但这件事永远不会被提起 下面是一些代码: protected override void Initialize() { base.Initialize(); applicationObject = (DTE2) GetService(typeof (DTE)); applicationObject.Events.Bui

我编写了一个visual studio扩展包,订阅DebuggerEvents.OneInterBreakMode事件。但这件事永远不会被提起

下面是一些代码:

protected override void Initialize()
    {
        base.Initialize();

        applicationObject = (DTE2) GetService(typeof (DTE));

        applicationObject.Events.BuildEvents.OnBuildDone += BuildEventsOnOnBuildDone;
        applicationObject.Events.DebuggerEvents.OnEnterBreakMode += DebuggerEventsOnOnEnterBreakMode;
    }
但是方法
DebuggerEventsOnOnEnterBreakMode
从未被调用。调用方法
buildEventsOnbuildDone


为什么会发生这种情况?

我知道这听起来很傻,但为了收听
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和事件。我听说它被称为“有史以来最烦人的bug”,这与事实并不遥远

我知道这听起来很愚蠢,但为了收听
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
属性,并将事件处理程序与其一起带走


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

我认为最烦人的部分是Events.DebuggerEvents不是一个单例——这是它通常在纯托管代码中实现的方式。谢谢!你救了我一天(甚至一周):)我认为令人烦恼的是Events.DebuggerEvents不是一个单例程序——这是它通常在纯托管代码中实现的方式。谢谢!你救了我一天(甚至一周):)