Compartir a través de


Cómo: Responder a eventos en un proyecto específico (Visual Basic)

El modelo de automatización incluye objetos que se pueden utilizar para responder a eventos de entorno del entorno de desarrollo integrado (IDE) de Visual Studio. Los eventos de entorno definidos en VSLangProj y VSLangProj80 son específicos de los proyectos de Visual C# y Visual Basic. Por ejemplo, se provoca ImportsEvents cuando se agrega o se quita una importación de una colección Imports.

En este ejemplo se utiliza Visual Basic para agregar un controlador de eventos ReferencesEvents, que es específico de un tipo de proyecto, a un proyecto de complemento. Los eventos ReferencesEvents se generan cuando se cambia, agrega o quita una referencia de un proyecto de Visual C# o Visual Basic.

NotaNota

Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones.La edición de Visual Studio que tenga y la configuración que esté usando determinan estos elementos.Para obtener más información, vea Personalizar la configuración de desarrollo en Visual Studio.

Para controlar eventos relacionados con referencias mediante Visual Basic

  1. Cree un proyecto de complemento de Visual Studio en Visual Basic.

  2. Agregue Imports VSLangProj al principio del archivo Connect.vb.

  3. En el menú Proyecto, haga clic en Agregar referencia, luego en la ficha .NET, seleccione el primer VSLangProj y haga clic en Aceptar.

  4. En la clase Connect, inicialice una variable para controlar el objeto ReferencesEvents y otra para controlar un objeto 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
    

    En este ejemplo, la variable se denomina refEvents.

    Otros objetos del modelo de automatización están relacionados con otros tipos de eventos específicos del proyecto. Por ejemplo, se provoca ImportsEvents cuando se agrega o se quita una importación de una colección Imports. BuildManagerEvents se aplica a eventos relacionados con ensamblados temporales compilados a partir de resultados de herramientas personalizadas. Para obtener más información sobre el objeto BuildManager, vea Introducción al objeto BuildManager. Para ver una lista completa de los eventos específicos de los tipos de proyecto, vea Objetos de evento (específicos para tipos de proyectos). Para obtener una lista de eventos de automatización generales, vea Objetos de eventos de automatización.

  5. En el método OnConnection, inicialice una variable para interceptar eventos. En este ejemplo, la variable se denomina events.

        Dim events As EnvDTE80.Events2
        events = CType(_applicationObject.Events, Events2)
    
  6. En el método OnConnection, inicialice una variable OutputWindow.

        Dim outputWindow As OutputWindow
        outputWindow = CType(_applicationObject.Windows.Item _
        (Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow)
        outputWinPane = outputWindow.OutputWindowPanes.Add_
        ("Reference Event Information ")
    
  7. Además, en el método OnConnection, recupere los objetos del evento del modelo de automatización.

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

    Visual Studio conecta automáticamente el controlador de métodos, porque la declaración de la variable de objeto utiliza el controlador WithEvents (Visual Basic).

    En este ejemplo, los eventos ReferencesEvents son específicos de proyectos de Visual C#. Para responder a eventos que son específicos de los eventos de Visual Basic, reemplace la cadena CSharpReferencesEvents por VBReferencesEvents. Para obtener más información sobre cómo determinar las cadenas que se deben utilizar en eventos específicos de diferentes tipos de proyectos, vea Objetos de evento (específicos para tipos de proyectos).

  8. Agregue procedimientos para cada evento relacionado con el objeto de evento. Por ejemplo, para controlar el evento que se produce al agregarse una referencia, se debería utilizar:

    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
    

    En el caso de ReferencesEvents, se deben haber definido los eventos de ReferenceAdded, ReferenceRemoved, ReferenceChanged, como se muestra en la lista completa del ejemplo que aparece más adelante.

  9. Finalmente, para evitar que Visual Studio haga más lento el funcionamiento del sistema al seguir supervisando los eventos relacionados con ventanas después de cerrar el complemento, debe deshabilitar el control de eventos. En Visual Basic, esto se hace estableciendo el controlador de eventos en Nothing.

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

    De esta forma, se desactiva el control de eventos, ya sea que se cierre el complemento o el IDE mientras el complemento aún se está ejecutando. Cuando se cierra el IDE, en primer lugar, todos los complementos en ejecución se cierran automáticamente.

Ejemplo

En el siguiente ejemplo de un complemento básico de Visual Studio se muestra cómo interceptar y controlar los eventos de referencia de Visual C# en Visual Studio. Siempre que se produce un evento de referencia, se envía un mensaje de notificación a la ventana de salida.

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

Compilar el código

Para compilar este código, cree un nuevo proyecto de complemento de Visual Studio en Visual Basic y reemplace el código de la clase Connect por el código del ejemplo. Para obtener información sobre cómo ejecutar un complemento, vea Cómo: Controlar complementos con el Administrador de complementos.

Vea también

Tareas

Cómo: Responder a eventos en un proyecto específico (Visual C#)

Referencia

Instrucción Imports (Tipo y espacio de nombres de .NET)

Otros recursos

Responder a eventos de automatización

Responder a eventos (Proyectos de Visual Basic y Visual C#)