Comment : répondre aux événements d'un projet spécifique (Visual C#)
Le modèle Automation inclut des objets qui peuvent être utilisés pour répondre à des événements d'environnement dans l'environnement de développement intégré (IDE) de Visual Studio. Les événements d'environnement définis dans VSLangProj et VSLangProj80 sont spécifiques aux projets Visual C# et Visual Basic. Par exemple, ImportsEvents est déclenché lorsqu'une instruction import est ajoutée ou supprimée dans un projet Visual Basic.
Cet exemple utilise Visual C# pour ajouter un gestionnaire d'événements ReferencesEvents (qui est spécifique à un type de projet) à un projet de complément. ReferencesEvents se déclenchent lorsqu'une référence est modifiée, ajoutée ou supprimée dans un projet Visual C# ouVisual Basic.
Notes
Il est possible que pour certains des éléments de l'interface utilisateur de Visual Studio, votre ordinateur affiche des noms ou des emplacements différents de ceux indiqués dans les instructions suivantes.Ces éléments dépendent de l'édition de Visual Studio dont vous disposez et des paramètres que vous utilisez.Pour plus d'informations, consultez Paramètres Visual Studio.
Pour gérer des événements liés à une référence à l'aide de Visual C#
Créez un projet de complément Visual Studio dans Visual C#.
Ajoutez using VSLangProj; au début du fichier Connect.cs.
Dans le menu Projet, cliquez sur Ajouter une référence, puis sur l'onglet .NET. Ensuite, sélectionnez le premier VSLangProj, puis cliquez sur OK.
Dans la classe Connect, initialisez une variable pour gérer l'objet ReferencesEvents et une autre pour gérer un OutputWindowPane.
private DTE2 _applicationObject; private AddIn _addInInstance; private VSLangProj.ReferencesEvents refEvents; private OutputWindowPane outputWinPane;
Dans cet exemple, la variable se nomme refEvents.
D'autres objets présents dans le modèle Automation sont en rapport avec d'autres types d'événements spécifiques au projet. Par exemple, ImportsEvents est déclenché lorsqu'une instruction import est ajoutée ou supprimée dans une collection Imports. BuildManagerEvents s'applique aux événements liés aux assemblys temporaires créés à partir des sorties d'outils personnalisés. Pour plus d'informations sur l'objet BuildManager, consultez Introduction à l'objet BuildManager. Pour obtenir la liste complète des événements spécifiques à des types de projets, consultez Objets événement (spécifiques aux types de projets). Pour obtenir la liste des événements Automation généraux, consultez Objets événement d'automation.
Dans la méthode OnConnection, initialisez une variable pour intercepter des événements. Dans cet exemple, la variable se nomme events.
EnvDTE80.Events2 events = (EnvDTE80.Events2)_applicationObject.Events;
Dans la méthode OnConnection, initialisez une variable OutputWindow.
OutputWindow outputWindow = (OutputWindow)_applicationObject.Windows.Item (Constants.vsWindowKindOutput).Object; outputWinPane = outputWindow.OutputWindowPanes.Add ("ReferencesEvents Event Information");
Par ailleurs, dans la méthode OnConnection, récupérez les objets événement issus du modèle Automation.
refEvents = (VSLangProj.ReferencesEvents)events.GetObject ("CSharpReferencesEvents");
Dans cet exemple, les ReferencesEvents sont spécifiques aux projets Visual C#. Pour répondre à des événements spécifiques à Visual Basic, remplacez la chaîne CSharpReferencesEvents par VBReferencesEvents. Pour plus d'informations sur la manière de déterminer les chaînes à utiliser pour des événements spécifiques aux types différents de projets, consultez Objets événement (spécifiques aux types de projets).
Connectez chaque délégué exposé à partir des objets événement récupérés à l'étape 3, en utilisant l'opérateur + =. Par exemple, pour connecter les délégués exposés par l'événement ReferenceAdded, vous utiliseriez :
refEvents.ReferenceAdded += new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
Ajoutez des procédures pour chaque événement en rapport avec l'objet événement. Par exemple, pour gérer l'événement qui se produit lorsqu'une référence est ajoutée, vous utiliserez :
public void ReferenceAdded( VSLangProj.Reference addedRef ) { outputWinPane.OutputString( "ReferencesEvents.ReferenceAdded" + "\n" ); outputWinPane.OutputString( "The reference to " + addedRef.Name + " was added." + "\n" ); }
Dans le cas de ReferencesEvents, vous devez avoir des événements définis pour :
et
La totalité de l'exemple ci-dessous inclut ces événements.
Enfin, pour empêcher Visual Studio de ralentir votre système en continuant à surveiller les événements associés à des fenêtres une fois le complément fermé, vous devez désactiver la gestion des événements. Dans Visual C#, pour ce faire, utilisez l'opérateur - =. Par exemple, pour désactiver la gestion des événements pour le ReferenceAdded, vous utiliseriez :
refEvents.ReferenceAdded -= new _dispReferencesEvents_ReferenceAddedEventHandler (this.ReferenceAdded);
La gestion des événements est alors désactivée si le complément ou l'IDE est arrêté tandis que le complément est encore en cours d'exécution. Une fois l'IDE arrêté, tous les compléments en cours d'exécution sont fermés automatiquement en premier.
Exemple
L'exemple suivant est un complément Visual Studio de base qui montre comment intercepter et gérer des événements de référence Visual C# dans Visual Studio. Dès qu'un événement de référence se produit, un message de notification est envoyé à la fenêtre Sortie.
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;
}}
Compilation du code
Pour compiler ce code, créez un projet de complément Visual Studio dans Visual C#, puis remplacez le code de la classe Connect par le code de l'exemple. Pour plus d'informations sur l'exécution d'un complément, consultez Comment : contrôler des compléments avec le Gestionnaire de compléments.
Voir aussi
Tâches
Comment : répondre aux événements d'un projet spécifique (Visual Basic)