2010-08-12 20 views
5

Quelqu'un peut-il suggérer le meilleur endroit pour ajouter des événements de solution ou de projet, tels que ProjectAdded, à un complément Visual Studio?Où dois-je joindre des événements de solution ou de projet dans mon complément Visual Studio?

Si je fais cela lorsque le complément se connecte alors aucune solution n'est chargée, alors comment savoir quand une solution a été chargée? Par exemple, si j'écris un événement pour gérer des éléments de projet ajoutés, où dois-je l'attacher? L'événement serait déclenché par le projet, et à son tour par la solution, donc je ne peux pas joindre les événements lorsque le complément se connecte car il n'y a pas de solution lorsque le complément se connecte. D'autre part, si je les ajoute dans l'événement Exec() alors j'ai besoin de faire des vérifications comme si l'événement a déjà été attaché, et je suis sûr qu'il doit y avoir un moyen plus net quelque part entre la connexion événements et l'événement Exec().

Répondre

5

Vous avez probablement compris cela depuis longtemps, mais de toute façon: Vous pouvez configurer vos événements de l'intérieur OnConnection comme indiqué ci-dessous, voici un extrait de Connect classe d'un Addin (en supposant que vous utilisez C#):

using System; 
using System.Globalization; 
using System.Reflection; 
using System.Resources; 
using EnvDTE; 
using EnvDTE80; 
using Extensibility; 
using Microsoft.VisualStudio.CommandBars; 

namespace MyAddin1 
{ 
    /// <summary>The object for implementing an Add-in.</summary> 
    /// <seealso class='IDTExtensibility2' /> 
    public class Connect : IDTExtensibility2, IDTCommandTarget 
    { 
    private DTE2 _applicationObject; 
    private AddIn _addInInstance; 
    private SolutionEvents _solutionEvents; 

    public void OnConnection(object application, ext_ConnectMode connectMode, 
      object addInInst, ref Array custom) 
    { 
     _applicationObject = (DTE2)application; 
     _addInInstance = (AddIn)addInInst; 

     // check the value of connectMode here, depending on your scenario 
     if(connectMode == ...) 
     SetupEvents(); 
    } 

    private void SetupEvents() 
    { 
     // this is important ... 
     _solutionEvents = _applicationObject.Events.SolutionEvents; 

     // wire up the events you need 
     _solutionEvents.Opened += new _dispSolutionEvents_OpenedEventHandler(_solutionEvents_Opened); 
     _solutionEvents.AfterClosing += new _dispSolutionEvents_AfterClosingEventHandler(_solutionEvents_AfterClosing); 
     _solutionEvents.ProjectAdded += new _dispSolutionEvents_ProjectAddedEventHandler(_solutionEvents_ProjectAdded); 
    } 

    // add procedures to handle the events here, plus any other 
    // handling you need, ie. OnDisconnection and friends 
} 

L'essentiel est de câbler la solution et de projeter les événements dont vous avez besoin, ce n'est pas important si une solution ou un projet est déjà chargé. Ils ne sont liés à aucune solution ou projet particulier, ils sont fournis par le modèle d'objet Visual Studio et sont incorporés dans l'espace de noms EnvDTE.

Cela n'aurait aucun sens de faire quoi que ce soit d'autre, puisque vous pouvez configurer un addin à charger lorsque VS démarre, et dans ce cas il n'y aura jamais de solutions/projets chargés.

Il y a quelques prises si:

  • Il est importante que vous gardez une référence à la classe SolutionEvents comme une variable de membre au sein de votre classe de connexion, sinon the events will never fire, (see also here). Vous devez vous assurer de vérifier le paramètre connectMode passé dans OnConnection. Cela est appelé plusieurs fois avec des paramètres différents, et si vous le faites de la mauvaise façon, vous pouvez obtenir l'événement plusieurs fois, ce qui sera certainement un problème. En outre, généralement tout IDE Addin, comme Menus et autres, est configuré à partir de OnConnection, de sorte que vous pouvez vous retrouver avec des éléments de menu en double si vous ne le faites pas correctement.

est ici quelques conseils, une partie du code fourni est le code VB, dans le cas où vous êtes à la recherche que:

Enfin, voici une liste d'articles, environ 70% d'entre eux couvrent des sujets de base et avancés concernant les addins:

Trouver la section MZ-Tools Articles série (add-ins) sur et jeter un oeil à ce qui est couvert là-bas.