Я сделал расширение внутри пакета, и я вызываю следующий код (происходит, когда пользователь нажимает кнопку на панели инструментов):Подписка на события DTE не работает - события не вызываются
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)
Любые идеи будут приветствовать
Спасибо! Виталий
Я была такая же проблема, и это решает ее. Благодаря! –
Вы спасли 2 дня моей работы. Внутри моей упаковки: 'private static SolutionEvents solutionEvents; protected override void Initialize() { ApplicationObject = GetService (typeof (DTE)) как DTE2; solutionEvents = ApplicationObject.Events.SolutionEvents;} ' – LukTar