Abonnement für DTE-Ereignisse scheint nicht zu funktionieren - Ereignisse werden nicht aufgerufen

Ich habe eine Erweiterung in einem Paket erstellt und rufe den folgenden Code auf (tritt auf, wenn ein Benutzer eine Schaltfläche in der Symbolleiste drückt):

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)
{
}

Das erste und größte Problem ist, dass das Abonnement für die Veranstaltung nicht funktioniert. Ich habe es versucht

Öffnen neuer DokumenteDetaching from debug (löst angeblich OnEnterDesignMode ausSpeichern eines Dokuments

Keine davon scheint Auswirkungen zu haben und die Rückruffunktionen wurden nie aufgerufen.

Das zweite Problem ist, dass das Abonnement für die Ereigniszeile NUR funktioniert (das Abonnement selbst, der Rückruf funktioniert nicht wie oben beschrieben), aber nach einer Weile wird die Abonnementzeile ausgeführt, z. B .:

_dte.Events.DebuggerEvents.OnEnterBreakMode -= DebuggerEvents_OnEnterBreakMode;

Verursacht eine Ausnahme:

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)

Irgendwelche Ideen sind willkommen

Vielen Dank! Vitaly

Antworten auf die Frage(4)

Ihre Antwort auf die Frage