Подписка на события 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)

Any идеи будут приветствоваться

Спасибо! Виталий

12
задан VitalyB 19 October 2017 в 13:47
поделиться