Sdílet prostřednictvím


Postupy: Reagování na události v konkrétním projektu (Visual C#)

Model automatizace obsahuje objekty, které lze použít k reakci na události prostředí v integrovaném vývojovém prostředí IDE Visual Studio.Události prostředí definované v VSLangProj a VSLangProj80 jsou specifické pro projekty Visual C# a Visual Basic.Například ImportsEvents se vyvolá, když je přidán či odebrán import z projektu Visual Basic.

V tomto příkladu se používá Visual C# pro přidání popisovače událostí ReferencesEvents, která je specifická pro typ projektu, do projektu doplňku.ReferencesEvents jsou vyvolány při změně, přidání nebo odebrání odkazu z projektu Visual C# nebo Visual Basic.

[!POZNÁMKA]

Váš počítač může zobrazit jiné názvy nebo umístění pro některé prvky uživatelského rozhraní sady Visual Studio v následujících pokynech.Tyto prvky jsou určeny verzí aplikace Visual Studio a použitým nastavením.Další informace naleznete v tématu Přizpůsobení nastavení pro vývoj v sadě Visual Studio.

Zpracování událostí souvisejících s odkazy v jazyce Visual C#

  1. Vytvořte projekt doplňku Visual Studio v Visual C#.

  2. Přidejte using VSLangProj; na začátek souboru Connect.cs.

  3. V nabídce Projekt klepněte na tlačítko Přidat odkaz, klepněte na kartu .NET, vyberte první VSLangProj a klepněte na tlačítko OK.

  4. Ve třídě Připojit inicializujte proměnnou ke zpracování, objekt ReferencesEvents a další zpracování OutputWindowPane.

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

    V tomto příkladu je proměnná pojmenována jako refEvents.

    Ostatní objekty v modelu automatizace se vztahují na jiné typy událostí, které jsou specifické pro projekt.Například ImportsEvents se vyvolá, když je přidán či odebrán import z kolekce Imports.BuildManagerEvents platí pro události týkající se dočasného sestavení z výstupů vlastních nástrojů.Další informace o objektu BuildManager najdete v tématu Představení objektu BuildManager.Úplný seznam událostí, které jsou specifické pro typy projektů naleznete v tématu Objekty událostí (specifické pro typy projektů) a seznam obecné automatizace událostí naleznete v tématu Automatizace objektů události.

  5. V metodě OnConnection inicializujte proměnnou pro zachycení událostí.V tomto příkladu je proměnná volána jako events.

    EnvDTE80.Events2 events = 
    (EnvDTE80.Events2)_applicationObject.Events;
    
  6. V metodě OnConnection inicializujte proměnnou OutputWindow.

    OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item
    (Constants.vsWindowKindOutput).Object;
    outputWinPane = outputWindow.OutputWindowPanes.Add
    ("ReferencesEvents Event Information");
    
  7. Také v metodě OnConnection načtěte objekty událostí z modelu automatizace.

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

    V tomto příkladu jsou ReferencesEvents specifické pro projekty Visual C#.Chcete-li reagovat na události, které jsou specifické pro události Visual Basic, nahraďte řetězec CSharpReferencesEvents hodnotou VBReferencesEvents.Další informace o určení řetězců pro události, které jsou specifické pro různé typy projektů naleznete v tématu Objekty událostí (specifické pro typy projektů).

  8. Připojte se ke všem delegátům vystaveným objekty událostí, které byly načteny v kroku 3 pomocí operátoru +=.Například pro připojení delegátů vystavených událostí ReferenceAdded byste měli použít:

    refEvents.ReferenceAdded += new 
    _dispReferencesEvents_ReferenceAddedEventHandler
    (this.ReferenceAdded);
    
  9. Přidejte procedury pro každou událost týkající objektu události.Například pro zpracování událostí, které nastanou, když je přidán odkaz, byste použili:

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

    V případě ReferencesEvents musíte mít definovány události pro:

    a

    Úplný seznam níže uvedeného příkladu zahrnuje tyto události.

  10. Nakonec, aby se zabránilo zpomalení systému aplikací Visual Studio tak, že nadále budou sledovány události týkající se oken po zavření doplňku, měli byste zakázat zpracování událostí.Ve Visual C# se toto provádí pomocí operátoru -=.Například chcete-li zakázat zpracování událostí pro ReferenceAdded, měli byste použili:

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

    Tím dojde k vypnutí zpracování událostí, ať je doplněk nebo IDE vypnutý, nebo je doplněk stále spuštěný.Při vypnutí rozhraní IDE se všechny spuštěné doplňky automaticky ukončí jako první.

Příklad

Následující příklad je základní doplněk Visual Studio, který ukazuje, jak vyhledat a zpracovat události odkazu Visual C# v Visual Studio.Kdykoli dojde k události na odkaz, je do okna Výstup zasláno oznámení.

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

Probíhá kompilace kódu

Chcete-li tento kód zkompilovat, vytvořte nový projekt doplňku Visual Studio v Visual C# a nahraďte kód ve třídě Připojit kódem v příkladu.Další informace o spuštění doplňku naleznete v části Postupy: Řízení doplňků pomocí Správce doplňků.

Viz také

Úkoly

Postupy: Reagování na události v konkrétním projektu (Visual Basic)

Referenční dokumentace

+= – operátor (Referenční dokumentace jazyka C#)

-= – operátor (Referenční dokumentace jazyka C#)

Další zdroje

Reagování na události automatizace

Reagování na události (projekty Visual Basic a Visual C#)