visual-studio - 订阅DTE事件似乎不起作用-事件不会被调用

标签 visual-studio visual-studio-2010 vsx

我已经在包内进行了扩展,并且正在调用以下代码(当用户按下工具栏中的按钮时发生):

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)


任何想法都将受到欢迎

谢谢!
维塔利

最佳答案

发布我从MSDN论坛上获得的answer,作者是Ryan Molden,以防它对任何人有帮助:


我相信这里的问题是
CLR处理COM端点(事件
下沉)。如果我记得正确的时候
你打
_applicationObject.Events.DebuggerEvents
CLR将成为您“链”的一部分
为创建一个新的DebuggerEvents对象
属性访问和不会缓存
它,因此它又回到了你,你
为其注册一个事件处理程序(

TEMPORARY对象和您的对象到期
给代表,但不是你的
对象到临时对象
会阻止GC)。那你就不会
将对象存储在任何地方
立即具有GC资格,并将
最终被GC了。


我更改了将DebuggerEvents存储为字段的代码,所有这些都开始正常工作。

关于visual-studio - 订阅DTE事件似乎不起作用-事件不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874015/

相关文章:

c - 错误: value of type "void *" cannot be assigned to an entity of type "int **"

c++ - 检查 STL 容器无法正常工作

c# - VS.NET 2010 对 C# 常量表达式的评估

visual-studio - 在相关工作项中默认添加工作项id

visual-studio-2010 - VS2010 - 删除不在解决方案中的文件

WPF xmlns :local="clr-namespace:

visual-studio-2008 - 从对象生成 DTO

visual-studio-2010 - Nuget 与 Web 安装程序。它与 VS 2010 扩展有何关系

visual-studio-2012 - 如何将命令添加到Visual Studio 2012?

visual-studio - 如何通过 DTE 监听 ProjectItem 的删除?