Freigeben über


Gewusst wie: Reagieren auf Ereignisse in einem bestimmten Projekt (Visual C#)

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#- und Visual Basic-Projekte spezifisch. So wird beispielsweise ImportsEvents ausgelöst, wenn einem Visual Basic-Projekt ein Importvorgang hinzugefügt bzw. daraus entfernt wird.

Dieses Beispiel fügt einem Add-In-Projekt mithilfe von Visual C# einen projekttypspezifischen ReferencesEvents-Ereignishandler hinzu. ReferencesEvents wird ausgelöst, wenn ein Verweis geändert, hinzugefügt oder aus einem Visual C#- oder Visual Basic-Projekt entfernt wird.

Tipp

Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Bei der Entwicklung dieser Verfahren war die Option Allgemeine Entwicklungseinstellungen aktiviert. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.

So behandeln Sie verweisbezogene Ereignisse mit Visual C#

  1. Erstellen Sie in Visual C# ein Visual Studio-Add-In-Projekt.

  2. Fügen Sie am Anfang der Datei Connect.cs using VSLangProj; ein.

  3. 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.

  4. 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. ImportsEvents wird z. B. ausgelöst, wenn einer Imports-Auflistung ein Importvorgang hinzugefügt bzw. daraus entfernt wird. BuildManagerEvents gilt für Ereignisse in Verbindung mit temporären Assemblys, die aus Ausgaben benutzerdefinierter Tools erstellt wurden. 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.

  5. 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;
    
  6. 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");
    
  7. 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. Ersetzen Sie die Zeichenfolge CSharpReferencesEvents durch VBReferencesEvents, um auf Ereignisse zu reagieren, die für Visual Basic spezifisch sind. 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).

  8. 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);
    
  9. 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.

  10. 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

Operator += (C#-Referenz)

Operator -= (C#-Referenz)

Weitere Ressourcen

Reagieren auf Automatisierungsereignisse

Reagieren auf Ereignisse (Visual Basic- und Visual C#-Projekte)