Condividi tramite


Procedura: rispondere agli eventi in un progetto specifico (Visual #)

Nel modello di automazione sono inclusi oggetti che è possibile utilizzare per rispondere a eventi di ambiente nell'ambiente di sviluppo integrato (IDE, Integrated Development Environment) di Visual Studio. Gli eventi di ambiente definiti in VSLangProj e VSLangProj80 sono specifici dei progetti Visual C# e Visual Basic. Ad esempio, ImportsEvents viene generato quando un'importazione viene aggiunta o rimossa da un progetto Visual Basic.

In questo esempio Visual C# viene utilizzato per aggiungere un gestore eventi ReferencesEvents, specifico di un tipo di progetto, a un progetto di componente aggiuntivo. Gli eventi ReferencesEvents vengono generati quando un riferimento viene modificato, aggiunto o rimosso da un progetto Visual C# o Visual Basic.

Nota

È possibile che le finestre di dialogo e i comandi di menu visualizzati siano diversi da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Queste procedure sono state sviluppate con le Impostazioni generali per lo sviluppo attive. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Gestione delle impostazioni.

Per gestire gli eventi riferimento mediante Visual C#

  1. Creare un progetto di componente aggiuntivo Visual Studio in Visual C#.

  2. Aggiungere using VSLangProj; all'inizio del file Connect.cs.

  3. Scegliere Aggiungi riferimento dal menu Progetto, selezionare la scheda .NET, il primo VSLangProj, quindi scegliere OK.

  4. Nella classe Connect inizializzare una variabile per gestire l'oggetto ReferencesEvents e un'altra per gestire un oggetto OutputWindowPane.

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

    Nell'esempio la variabile è denominata refEvents.

    Altri oggetti del modello di automazione sono correlati ad altri tipi di eventi specifici del progetto. Ad esempio, ImportsEvents viene generato quando un'importazione viene aggiunta o rimossa da un insieme Imports. BuildManagerEvents si applica a eventi correlati ad assembly temporanei compilati da output di strumenti personalizzati. Per ulteriori informazioni sull'oggetto BuildManager, vedere Introduzione all'oggetto BuildManager. Per un elenco completo degli eventi specifici di tipi di progetti, vedere Oggetti di eventi (specifici dei tipi di progetto). Per un elenco degli eventi di automazione generali, vedere Oggetti degli eventi di automazione.

  5. Nel metodo OnConnection inizializzare una variabile per intercettare gli eventi. Nell'esempio la variabile è denominata events.

    EnvDTE80.Events2 events = 
    (EnvDTE80.Events2)_applicationObject.Events;
    
  6. Nel metodo OnConnection inizializzare una variabile OutputWindow.

    OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item
    (Constants.vsWindowKindOutput).Object;
    outputWinPane = outputWindow.OutputWindowPanes.Add
    ("ReferencesEvents Event Information");
    
  7. Nel metodo OnConnection recuperare gli oggetti evento dal modello di automazione.

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

    Nell'esempio gli oggetti ReferencesEvents sono specifici dei progetti Visual C#. Per rispondere a eventi specifici di Visual Basic, sostituire la stringa CSharpReferencesEvents con VBReferencesEvents. Per ulteriori informazioni su come determinare le stringhe da utilizzare per eventi specifici di tipi diversi di progetti, vedere Oggetti di eventi (specifici dei tipi di progetto).

  8. Stabilire la connessione a ogni delegato esposto dagli oggetti evento recuperati nel passaggio 3 mediante l'operatore +=. Per connettere i delegati esposti dall'evento ReferenceAdded, ad esempio, si utilizzerebbe:

    refEvents.ReferenceAdded += new 
    _dispReferencesEvents_ReferenceAddedEventHandler
    (this.ReferenceAdded);
    
  9. Aggiungere routine per ogni evento correlato all'oggetto evento. Per gestire l'evento che viene generato all'aggiunta di un riferimento, ad esempio, si utilizzerebbe:

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

    Nel caso di ReferencesEvents, è necessario disporre di eventi definiti per:

    e

    Nell'elenco completo dell'esempio riportato di seguito sono inclusi questi eventi.

  10. Infine, per evitare che il sistema venga rallentato a causa del monitoraggio continuo degli eventi relativi a finestre da parte di Visual Studio, dopo la chiusura del componente aggiuntivo è necessario disabilitare la gestione degli eventi. In Visual C# questo risultato viene ottenuto mediante l'operatore -=. Per disabilitare la gestione degli eventi per ReferenceAdded, ad esempio, si utilizzerebbe:

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

    La gestione degli eventi viene disabilitata sia che il componente aggiuntivo o l'IDE venga arrestato quando il componente aggiuntivo è ancora in esecuzione. Prima che l'IDE venga arrestato, vengono arrestati automaticamente tutti i componenti aggiuntivi in esecuzione.

Esempio

Nell'esempio riportato di seguito è illustrato un componente aggiuntivo di Visual Studio di base per l'intercettazione e la gestione degli eventi riferimento di Visual C# in Visual Studio. Ogni volta che viene generato un evento riferimento, un messaggio di notifica viene inviato alla finestra di output.

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

Compilazione del codice

Per compilare il codice, creare un nuovo progetto aggiuntivo Visual Studio e in Visual C# sostituire il codice della classe Connect con il codice riportato nell'esempio. Per ulteriori informazioni sull'esecuzione di un componente aggiuntivo, vedere Procedura: controllare i componenti aggiuntivi tramite Gestione componenti aggiuntivi.

Vedere anche

Attività

Procedura: rispondere agli eventi in un progetto specifico (Visual Basic)

Riferimenti

Operatore += (Riferimenti per C#)

-= Operator (C# Reference)

Altre risorse

Risposta a eventi di automazione

Risposta agli eventi (progetti Visual Basic e Visual C#)