Gewusst wie: Reagieren auf Ereignisse in einem bestimmten Projekt (Visual C#)
Aktualisiert: November 2007
Das Automatisierungsmodell enthält Objekte, mit denen Sie auf Umgebungsereignisse in der integrierten Entwicklungsumgebung (Integrated Development Environment, IDE) von Visual Studio reagieren können. Die in VSLangProj und VSLangProj80 definierten Umgebungsereignisse sind für Visual C#-, Visual Basic- und Visual J#-Projekte spezifisch. So wird beispielsweise ImportsEvents ausgelöst, wenn einem Visual Basic-Projekt ein Importvorgang hinzugefügt bzw. daraus entfernt wird.
In diesem Beispiel wird in Visual C# ein ReferencesEvents-Ereignishandler hinzugefügt, der für einen Projekttyp spezifisch ist, um ein Add-In-Projekt hinzuzufügen. ReferencesEvents werden in den folgenden Situationen ausgelöst: Ein Verweis wird geändert, ein Verweis wird einem Visual C#-, Visual Basic- oder Visual J#-Projekt hinzugefügt bzw. daraus entfernt.
Hinweis: |
---|
Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Bei der Entwicklung dieser Prozeduren war die Option Allgemeine Entwicklungseinstellungen aktiviert. Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen. |
So behandeln Sie verweisbezogene Ereignisse mit Visual C#
Erstellen Sie in Visual C# ein Visual Studio-Add-In-Projekt.
Fügen Sie am Anfang der Datei Connect.cs using VSLangProj; ein.
Klicken Sie im Menü Projekt auf Verweis hinzufügen, klicken Sie auf die Registerkarte .NET, wählen Sie das erste VSLangProj aus, und klicken Sie dann auf OK.
Initialisieren Sie in der Connect-Klasse eine Variable zum Behandeln des ReferencesEvents-Objekts und eine weitere Variable zum Behandeln von OutputWindowPane.
private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj.ReferencesEvents refEvents;private OutputWindowPane outputWinPane;
In diesem Beispiel hat die Variable den Namen refEvents.
Andere Objekte im Automatisierungsmodell beziehen sich auf andere projektspezifische Ereignistypen. So wird z. B. ImportsEvents ausgelöst, wenn einer Imports-Auflistung ein Importvorgang hinzugefügt bzw. daraus entfernt wird. BuildManagerEvents gilt für Ereignisse in Bezug auf temporäre, aus den Ausgaben benutzerdefinierter Tools erstellte Assemblys. Weitere Informationen über das BuildManager-Objekt finden Sie unter Einführung in das BuildManager-Objekt. Eine vollständige Liste mit Ereignissen, die für Projekttypen gelten, finden Sie unter Ereignisobjekte (abgestimmt auf Projekttypen). Eine Liste der allgemeinen Automatisierungsereignisse finden Sie unter Ereignisobjekte für die Automatisierung.
Initialisieren Sie in der OnConnection-Methode eine Variable, um Ereignisse abzufangen. In diesem Beispiel trägt die Variable die Bezeichnung events.
EnvDTE80.Events2 events = (EnvDTE80.Events2)_applicationObject.Events;
Initialisieren Sie in der OnConnection-Methode eine OutputWindow-Variable.
OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item (Constants.vsWindowKindOutput).Object; outputWinPane = outputWindow.OutputWindowPanes.Add ("ReferencesEvents Event Information");
Rufen Sie in der OnConnection-Methode zudem die Ereignisobjekte vom Automatisierungsmodell ab.
refEvents = (VSLangProj.ReferencesEvents)events.GetObject ("CSharpReferencesEvents");
In diesem Beispiel gelten ReferencesEvents für Visual C#-Projekte. Um auf Visual Basic- oder Visual J#-spezifische Ereignisse reagieren zu können, ersetzen Sie die Zeichenfolge CSharpReferencesEvents durch VBReferencesEvents bzw. VJSharpReferencesEvents. Weitere Informationen zum Festlegen der Zeichenfolgen, die für Ereignisse verwendet werden, die für unterschiedliche Projekttypen gelten, finden Sie unter Ereignisobjekte (abgestimmt auf Projekttypen).
Stellen Sie die Verbindung zu den Delegaten her, die von den in Schritt 3 mithilfe des +=-Operators abgerufenen Ereignisobjekten verfügbar gemacht werden. Um beispielsweise die Verbindung zu Delegaten herzustellen, die vom ReferenceAdded-Ereignis verfügbar gemacht werden, verwenden Sie den folgenden Code:
refEvents.ReferenceAdded += new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
Fügen Sie Prozeduren für jedes auf das Ereignisobjekt bezogene Ereignis hinzu. Um beispielsweise das Ereignis zu behandeln, das beim Hinzufügen eines Verweises auftritt, verwenden Sie folgenden Code:
public void ReferenceAdded( VSLangProj.Reference addedRef ) { outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" + "\n" ); outputWinPane.OutputString( "The reference to " + addedRef.Name + " was added." + "\n" ); }
Im Fall von ReferencesEvents müssen Ereignisse definiert sein für:
und
In der nachfolgenden vollständigen Auflistung des Beispiels werden diese Ereignisse berücksichtigt.
Um schließlich zu verhindern, dass Visual Studio nach Schließen des Add-Ins durch die fortdauernde Überwachung fensterbezogener Ereignisse die Systemleistung beeinträchtigt, sollten Sie die Ereignisbehandlung deaktivieren. In Visual C# verwenden Sie dazu den -=-Operator. Um beispielsweise die Ereignisbehandlung für ReferenceAdded zu deaktivieren, verwenden Sie den folgenden Code:
refEvents.ReferenceAdded -= new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
Dadurch wird die Ereignisbehandlung unabhängig davon deaktiviert, ob das Add-In oder die IDE heruntergefahren wird, während das Add-In ausgeführt wird. Wenn die IDE heruntergefahren wird, werden automatisch alle ausgeführten Add-Ins zuerst beendet.
Beispiel
Das folgende Beispiel mit einem einfachen Visual Studio-Add-In veranschaulicht das Abfangen und Behandeln von Visual C#-Verweisereignissen in Visual Studio. Sobald ein Verweisereignis auftritt, wird an das Ausgabefenster eine Benachrichtigung gesendet.
using System;
using Microsoft.VisualStudio.CommandBars;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using VSLangProj;
public Connect()
{
}
public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
// Retrieve the event objects from the automation model.
EnvDTE80.Events2 events =
(EnvDTE80.Events2)_applicationObject.Events;
// Send event messages to the Output window.
OutputWindow outputWindow =
(OutputWindow)_applicationObject.Windows.Item
(Constants.vsWindowKindOutput).Object;
outputWinPane =
outputWindow.OutputWindowPanes.Add
("ReferencesEvents Event Information");
// Retrieve the event objects from the automation model.
refEvents = (VSLangProj.ReferencesEvents)
events.GetObject("CSharpReferencesEvents");
// Connect to each delegate exposed from each object
// retrieved above.
refEvents.ReferenceAdded += new
_dispReferencesEvents_ReferenceAddedEventHandler
(this.ReferenceAdded);
refEvents.ReferenceChanged += new
_dispReferencesEvents_ReferenceChangedEventHandler
(this.ReferenceChanged);
refEvents.ReferenceRemoved += new
_dispReferencesEvents_ReferenceRemovedEventHandler
(this.ReferenceRemoved);
}
public void OnDisconnection(Extensibility.ext_DisconnectMode
disconnectMode, ref System.Array custom)
{
// If the delegate handlers have been connected, then
// disconnect them here.
// If you do not do this, the handlers may still
// fire because they have not been garbage collected.
if (refEvents != null)
{
refEvents.ReferenceAdded -= new
_dispReferencesEvents_ReferenceAddedEventHandler
(this.ReferenceAdded);
refEvents.ReferenceChanged -= new
_dispReferencesEvents_ReferenceChangedEventHandler
(this.ReferenceChanged);
refEvents.ReferenceRemoved -= new
_dispReferencesEvents_ReferenceRemovedEventHandler
(this.ReferenceRemoved);
}
}
// References related events.
public void ReferenceRemoved( VSLangProj.Reference removedRef )
{
outputWinPane.OutputString( "ReferencesEvents.ReferenceRemoved"
+ "\n" );
outputWinPane.OutputString( "The reference to " + removedRef.Name
+ " was removed." + "\n" );
}
public void ReferenceChanged( VSLangProj.Reference changedRef )
{
outputWinPane.OutputString( "ReferencesEvents.ReferenceChanged"
+ "\n" );
outputWinPane.OutputString( "The reference to " + changedRef.Name
+ " was changed." + "\n" );
}
public void ReferenceAdded( VSLangProj.Reference addedRef )
{
outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" +
"\n" );
outputWinPane.OutputString( "The reference to " + addedRef.Name
+ " was added." + "\n" );
}
public void OnAddInsUpdate(ref System.Array custom)
{
}
public void OnStartupComplete(ref System.Array custom)
{
}
public void OnBeginShutdown(ref System.Array custom)
{
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
private VSLangProj.ReferencesEvents refEvents;
private OutputWindowPane outputWinPane;
}}
Kompilieren des Codes
Um diesen Code zu kompilieren, erstellen Sie in Visual C# ein neues Visual Studio-Add-In-Projekt und ersetzen den Code der Connect-Klasse durch den Code im Beispiel. Informationen zum Ausführen eines Add-Ins finden Sie unter Gewusst wie: Steuern von Add-Ins mit dem Add-In-Manager.
Siehe auch
Aufgaben
Gewusst wie: Reagieren auf Ereignisse in einem bestimmten Projekt (Visual Basic)
Referenz
Weitere Ressourcen
Reagieren auf Automatisierungsereignisse
Reagieren auf Ereignisse (Visual Basic- und Visual C#-Projekte)