gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:23:54 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com