我在包内进行了扩展,并调用以下代码(当用户按下工具栏中的按钮时发生):
DocumentEvents documentEvents = (DTE2)GetService(typeof(DTE));
_dte.Events.DebuggerEvents.OnEnterBreakMode += DebuggerEvents_OnEnterBreakMode;
_dte.Events.DebuggerEvents.OnEnterDesignMode += DebuggerEvents_OnEnterDesignMode;
_dte.Events.DebuggerEvents.OnContextChanged += DebuggerEvents_OnContextChanged;
_dte.Events.DocumentEvents.DocumentSaved += new _dispDocumentEvents_DocumentSavedEventHandler(DocumentEvents_DocumentSaved);
_dte.Events.DocumentEvents.DocumentOpened += new _dispDocumentEvents_DocumentOpenedEventHandler(DocumentEvents_DocumentOpened);
void DocumentEvents_DocumentOpened(Document Document)
{
}
void DocumentEvents_DocumentSaved(Document Document)
{
}
void DebuggerEvents_OnEnterBreakMode(dbgEventReason Reason, ref dbgExecutionAction ExecutionAction)
{
}
void DebuggerEvents_OnContextChanged(Process NewProcess, Program NewProgram, Thread NewThread, StackFrame NewStackFrame)
{
}
private void DebuggerEvents_OnEnterDesignMode(dbgEventReason reason)
{
}
第一个也是主要的问题是事件订阅不起作用。我试过了:
- 打开新文档
- 脱离调试(因此据说触发 OnEnterDesignMode
- 保存文档
这些似乎都没有任何效果,并且回调函数从未被调用。
第二个问题是对事件线的订阅通常有效(订阅本身,回调不起作用,如上所述),但在运行订阅线一段时间后,例如:
_dte.Events.DebuggerEvents.OnEnterBreakMode -= DebuggerEvents_OnEnterBreakMode;
导致异常:
Exception occured!
System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.
at System.StubHelpers.StubHelpers.StubRegisterRCW(Object pThis, IntPtr pThread)
at System.Runtime.InteropServices.UCOMIConnectionPoint.Unadvise(Int32 dwCookie)
at EnvDTE._dispDebuggerEvents_EventProvider.remove_OnEnterDesignMode(_dispDebuggerEvents_OnEnterDesignModeEventHandler A_1)
任何想法都会受到欢迎
谢谢!
维塔利
发布一个answer http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/7ec92d44-afa0-4778-bea4-6cbdd658962c?prof=required这是我从 Ryan Molden 的 MSDN 论坛上获得的,以防它对任何人有帮助:
我相信这里的问题是如何
CLR 处理 COM 端点(事件
水槽)。如果我没记错的话
你击中了
_applicationObject.Events.DebuggerEvents
CLR 将作为你的“链”的一部分
创建一个新的 DebuggerEvents 对象
属性访问并且不会缓存
它,因此它又回到你身边,你
向它注册一个事件处理程序(其中
在之间创建强有力的参考
临时对象和您的到期对象
给代表,但不是来自您的
对象到临时对象,其中
会阻止 GC)。那你不
将该对象存储在任何地方,所以它是
立即符合 GC 资格并将
最终被 GC 处理。
我更改了代码以将 DebuggerEvents 存储为字段,一切开始正常工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)