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

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 provocan eventos ImportsEvents cuando se agrega o se quita una importación de un proyecto de Visual Basic.

En este ejemplo se utiliza Visual C# 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.

Nota

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Estos procedimientos se han desarrollado con la Configuración de desarrollo general activa. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Trabajar con valores de configuración.

Para controlar eventos relacionados con referencias mediante Visual C#

  1. Cree un proyecto de complemento de Visual Studio en Visual C#.

  2. Agregue using VSLangProj; al principio del archivo Connect.cs.

  3. En el menú Proyecto, haga clic en Agregar referencia, 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.

        private DTE2 _applicationObject;
        private AddIn _addInInstance;
        private VSLangProj.ReferencesEvents refEvents;
        private OutputWindowPane outputWinPane;
    

    En este ejemplo, la variable se denomina refEvents.

    Objetos adicionales del modelo de automatización se relacionan 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 obtener una lista completa de los eventos específicos de tipos de proyectos, vea Objetos de evento (específicos para tipos de proyectos) y para obtener una lista de los eventos de automatización general, 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.

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

    OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item
    (Constants.vsWindowKindOutput).Object;
    outputWinPane = outputWindow.OutputWindowPanes.Add
    ("ReferencesEvents Event Information");
    
  7. Además, en el método OnConnection, recupere los objetos del evento del modelo de automatización.

    refEvents = 
    (VSLangProj.ReferencesEvents)events.GetObject
    ("CSharpReferencesEvents");
    

    En este ejemplo, los eventos ReferencesEvents son específicos de proyectos de Visual C#. Para responder a eventos específicos 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. Conéctese a cada delegado expuesto a partir de los objetos de evento recuperados en el paso 3, mediante el operador +=. Por ejemplo, para conectarse a los delegados expuestos por el evento ReferenceAdded, se debería utilizar:

    refEvents.ReferenceAdded += new 
    _dispReferencesEvents_ReferenceAddedEventHandler
    (this.ReferenceAdded);
    
  9. 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:

    public void ReferenceAdded( VSLangProj.Reference addedRef ) 
    { 
        outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" 
    + "\n" ); 
        outputWinPane.OutputString( "The reference to " + addedRef.Name
     + " was added." + "\n" ); 
    }
    

    En el caso de ReferencesEvents, se deben haber definido los eventos de:

    y

    La lista completa del ejemplo que aparece a continuación incluye estos eventos.

  10. 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 C#, lo lleva a cabo el operador -=. Por ejemplo, para deshabilitar el control de eventos de ReferenceAdded, se debería utilizar:

    refEvents.ReferenceAdded -= new
     _dispReferencesEvents_ReferenceAddedEventHandler
    (this.ReferenceAdded);
    

    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.

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;
  }}

Compilar el código

Para compilar este código, cree un nuevo proyecto de complemento de Visual Studio en Visual C# 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 Basic)

Referencia

Operador += (Referencia de C#)

-= Operador (Referencia de C#)

Otros recursos

Responder a eventos de automatización

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