C# Visual Studio扩展包中未触发DebuggerEvents.OneInterBreakMode
我编写了一个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
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不是一个单例程序——这是它通常在纯托管代码中实现的方式。谢谢!你救了我一天(甚至一周):)