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 DokumentsKeine 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