Porady: odpowiadanie na zdarzenia w specyficznym projekcie (Visual C#)
Model automatyzacji zawiera obiekty, które mogą służyć do reagowania na zdarzenia środowiska w zintegrowanym środowisku programistycznym (IDE) Visual Studio.Zdarzenia środowiska, określone w VSLangProj i VSLangProj80 są specyficzne dla projektów Visual C# i Visual Basic.Na przykład obiekt ImportsEvents jest zgłaszany, gdy import jest dodawany lub usuwany z projektu w języku Visual Basic.
Ten przykład używa Visual C#, aby dodać program obsługi zdarzeń ReferencesEvents, który jest specyficzny dla typu projektu, do projektu dodatek.ReferencesEvents są wywoływane, gdy zmianie odwołanie jest zmieniane, dodawane do lub usuwane z projektu Visual C# lub Visual Basic.
[!UWAGA]
Komputer może polazać inne nazwy lub lokalizacje dla niektórych elementów interfejsu użytkownika Visual Studio w dalszych instrukcjach.Te elementy są determinowane przez numer edycji Twojego programu Visual Studio oraz Twoje ustawienia.Aby uzyskać więcej informacji, zobacz Dostosowywanie ustawień środowiska deweloperskiego w Visual Studio.
Do obsługi zdarzeń związanych z odwołaniami przy Visual C#
Utwórz projekt dodatku Visual Studio w Visual C#.
Dodaj using VSLangProj; na początku pliku Connect.cs.
W menu Projekt kliknij polecenie Dodaj odwołanie, kliknij kartę .NET, zaznacz pierwszą pozycję VSLangProj, a następnie kliknij przycisk OK.
W klasie Połącz zainicjuj zmienną do obsługi obiektu ReferencesEvents i inny do obsługi obiektu OutputWindowPane.
private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj.ReferencesEvents refEvents; private OutputWindowPane outputWinPane;
W tym przykładzie zmienna ma nazwę refEvents.
Inne obiekty w modelu automatyzacji odnoszą się do innych rodzajów zdarzeń, które są specyficzne dla projektu.Na przykład, obiekt ImportsEvents jest zgłaszany, gdy import jest dodawany lub usuwany z kolekcji Imports.BuildManagerEvents stosuje się do zdarzeń związanych z zestawami tymczasowymi zbudowanymi na podstawie danych wyjściowych narzędzi niestandardowych.Aby uzyskać więcej informacji na temat obiektu BuildManager, zobacz Wprowadzenie do obiektu BuildManager.Aby uzyskać pełną listę zdarzeń, które są specyficzne dla typów projektów, zobacz Obiekty zdarzeń (specyficzne dla typów projektów), a aby uzyskać listę ogólnych zdarzeń automatyzacji, zobacz Obiekty zdarzeń automatyzacji.
W metodzie OnConnection zainicjuj zmienną do przechwytywania zdarzeń.W tym przykładzie zmienna jest nazywana events.
EnvDTE80.Events2 events = (EnvDTE80.Events2)_applicationObject.Events;
W metodzie OnConnection zainicjuj zmienną OutputWindow.
OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item (Constants.vsWindowKindOutput).Object; outputWinPane = outputWindow.OutputWindowPanes.Add ("ReferencesEvents Event Information");
Również w metodzie OnConnection pobierz obiekty zdarzenia z modelu automatyzacji.
refEvents = (VSLangProj.ReferencesEvents)events.GetObject ("CSharpReferencesEvents");
W tym przykładzie właściwości ReferencesEvents są specyficzne dla projektów w języku Visual C#.Aby reagować na specyficzne zdarzenia Visual Basic, zastąp ciąg CSharpReferencesEventsVBReferencesEvents.Aby uzyskać więcej informacji dotyczących sposobu ustalania ciągów do użycia dla zdarzeń, które są specyficzne dla różnych typów projektów, zobacz Obiekty zdarzeń (specyficzne dla typów projektów).
Podłącz do każdego delegata narażonego na obiekty zdarzeń pobranego w kroku 3 przy użyciu += operator.Na przykład aby połączyć delegatów udostępnianych przez zdarzenie ReferenceAdded, należy użyć polecenia:
refEvents.ReferenceAdded += new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
Dodawanie procedury dla każdego zdarzenia, które jest związane z obiektem zdarzenia.Na przykład do obsługi zdarzenia, które wystąpiło podczas dodawania odwołania, możesz użyć:
public void ReferenceAdded( VSLangProj.Reference addedRef ) { outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" + "\n" ); outputWinPane.OutputString( "The reference to " + addedRef.Name + " was added." + "\n" ); }
W przypadku właściwości ReferencesEvents musisz mieć zdefiniowane zdarzenia dla:
i
Pełna lista dla poniższego przykładu zawiera te zdarzenia.
Na koniec aby zapobiec spowalnianiu przez program Visual Studio systemu poprzez kontynuowanie monitorowania zdarzeń związanych z oknami po zamknięciu dodatku, należy wyłączyć obsługę zdarzeń.W języku Visual C# odbywa się to za pomocą operatora -=.Na przykład aby wyłączyć obsługę zdarzeń dla zdarzenia ReferenceAdded, należy użyć:
refEvents.ReferenceAdded -= new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
Powoduje to wyłączenie obsługi zdarzeń niezależnie od tego, czy dodatek lub IDE jest zamknięty w czasie gdy nadal uruchomiony jest dodatek.Po wyłączeniu IDE wszystkie uruchomione dodatki są automatycznie zamykane jak pierwsze.
Przykład
Poniższy przykład to podstawowy dodatek Visual Studio, który demonstruje, jak przechwytywać i obsługiwać odwołania Visual C# zdarzeń w Visual Studio.W każdym przypadku, gdy wystąpi zdarzenie odniesienia, komunikat z powiadomieniem jest wysyłany do okna Dane wyjściowe.
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;
}}
Kompilowanie kodu
Aby skompilować ten kod, utwórz nowy projekt dodatku Visual Studio w Visual C# i zastąp kod klasy Połącz kodem w przykładzie.Aby uzyskać informacje na temat uruchamiania dodatku, zobacz Porady: kontrolowanie dodatków za pomocą menedżera dodatków.
Zobacz też
Zadania
Porady: odpowiadanie na zdarzenia w specyficznym projekcie (Visual Basic)
Informacje
+= — Operator (odwołanie w C#)
Inne zasoby
Odpowiadanie na zdarzenia automatyzacji
Odpowiadanie na zdarzenia (projekty Visual Basic oraz Visual C#)