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

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. ImportsEvents wird z. B. ausgelöst, wenn einer Imports-Auflistung ein Importvorgang hinzugefügt bzw. daraus entfernt wird.

In diesem Beispiel wird in Visual Basic 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 Basic

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

  2. Fügen Sie am Anfang der Datei Connect.vb Imports 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.

    Public Class Connect
        Implements IDTExtensibility2
        Dim _applicationObject As DTE2
        Dim _addInInstance As AddIn
        ' Handle Reference events.
        Public WithEvents refEvents As VSLangProj.ReferencesEvents
        Private outputWinPane As OutputWindowPane
    

    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 der Ereignisse, die für Projekttypen gelten, finden Sie unter Ereignisobjekte (abgestimmt auf Projekttypen). Eine Liste allgemeiner Automatisierungsereignisse finden Sie unter Ereignisobjekte für die Automatisierung.

  5. Initialisieren Sie in der OnConnection-Methode eine Variable, um Ereignisse abzufangen. In diesem Beispiel hat die Variable den Namen events.

        Dim events As EnvDTE80.Events2
        events = CType(_applicationObject.Events, Events2)
    
  6. Initialisieren Sie in der OnConnection-Methode eine OutputWindow-Variable.

        Dim outputWindow As OutputWindow
        outputWindow = CType(_applicationObject.Windows.Item _
        (Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow)
        outputWinPane = outputWindow.OutputWindowPanes.Add_
        ("Reference Event Information ")
    
  7. Rufen Sie in der OnConnection-Methode zudem die Ereignisobjekte vom Automatisierungsmodell ab.

    refEvents = CType(events.GetObject("CSharpReferencesEvents"),_
     ReferencesEvents)
    

    Visual Studio stellt automatisch die Verbindung zum Methodenhandler her, da die Deklaration der Objektvariablen den WithEvents-Handler verwendet.

    In diesem Beispiel gelten ReferencesEvents für Visual C#-Projekte. Um auf Ereignisse zu reagieren, die für Visual Basic- oder Visual J#-Ereignisse spezifisch sind, 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).

  8. 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:

    Sub ReferenceAdded(ByVal addedRef As VSLangProj.Reference)_
        Handles refEvents.ReferenceAdded
        outputWinPane.OutputString_
        ("ReferencesEvents.ReferenceAdded" & ControlChars.Lf)
        outputWinPane.OutputString("The reference to " _
        & addedRef.Name & " was added." & ControlChars.Lf)
    End Sub
    

    Für ReferencesEvents müssen Sie Ereignisse für ReferenceAdded, ReferenceRemoved, ReferenceChanged definieren, wie in der vollständigen Liste im unten stehenden Beispiel zu sehen.

  9. 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. Dazu legen Sie in Visual Basic den Ereignishandler auf Nothing fest.

    Public Sub OnDisconnection(ByVal RemoveMode As_
     Extensibility.ext_DisconnectMode, ByRef custom As System.Array)_
     Implements Extensibility.IDTExtensibility2.OnDisconnection
        refEvents = Nothing
    End Sub
    

    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.

Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj

Public Class Connect
    Implements IDTExtensibility2
    Dim _applicationObject As DTE2
    Dim _addInInstance As AddIn
    ' Handle Reference events.
    Public WithEvents refEvents As VSLangProj.ReferencesEvents
    Private outputWinPane As OutputWindowPane
Public Sub OnBeginShutdown(ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnBeginShutdown
End Sub

Public Sub OnAddInsUpdate(ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
End Sub

Public Sub OnStartupComplete(ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnStartupComplete
End Sub

Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) _
 Implements Extensibility.IDTExtensibility2.OnDisconnection
    ' Turns off reference event handling when the add-in shuts down.
    refEvents = Nothing
End Sub

Public Sub OnConnection(ByVal application As Object, _
 ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef _
 custom As System.Array) Implements _
 Extensibility.IDTExtensibility2.OnConnection

    _applicationObject = CType(application, EnvDTE80.DTE2)
    _addInInstance = CType(addInInst, EnvDTE.AddIn)

    Dim events As EnvDTE80.Events2
    events = CType(_applicationObject.Events, Events2)
    ' Send event messages to the Output window.
    Dim outputWindow As OutputWindow
    outputWindow = CType(_applicationObject.Windows.Item _
    (Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow)
    outputWinPane = outputWindow.OutputWindowPanes.Add _
    ("Reference Event Information ")

    ' Retrieve the event objects from the automation model.
    ' Visual Basic automatically connects the method handler since 
    ' the object variable declaration uses the 'WithEvents' handler.
    refEvents = CType(events.GetObject("CSharpReferencesEvents"), _
    ReferencesEvents)
End Sub
    ' Handle all of the various reference-related events.
    Sub ReferenceRemoved(ByVal removedRef As VSLangProj.Reference) _
    Handles refEvents.ReferenceRemoved
    outputWinPane.OutputString("ReferencesEvents.ReferenceRemoved" _
    & ControlChars.Lf)
    outputWinPane.OutputString("The reference to " & removedRef.Name _
    & " was removed." & ControlChars.Lf)
End Sub

Sub ReferenceChanged(ByVal changedRef As VSLangProj.Reference) _
    Handles refEvents.ReferenceChanged
    outputWinPane.OutputString("ReferencesEvents.ReferenceChanged" _
    & ControlChars.Lf)
    outputWinPane.OutputString("The reference to " & changedRef.Name _
    & " was changed." & ControlChars.Lf)
End Sub
Sub ReferenceAdded(ByVal addedRef As VSLangProj.Reference) _
    Handles refEvents.ReferenceAdded
    outputWinPane.OutputString("ReferencesEvents.ReferenceAdded" _
    & ControlChars.Lf)
    outputWinPane.OutputString("The reference to " & addedRef.Name _
    & " was added." & ControlChars.Lf)
End Sub

End Class

Kompilieren des Codes

Um diesen Code zu kompilieren, erstellen Sie in Visual Basic 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 C#)

Referenz

Imports-Anweisung (.NET-Namespace und Typ)

Weitere Ressourcen

Reagieren auf Automatisierungsereignisse

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