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调用方法.
为什么会这样?
我知道这听起来很傻但是为了听取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和事件.我听说它被称为"有史以来最令人烦恼的错误",它与事实并不遥远
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |