2010-08-12 7 views
5

Qualcuno può suggerire il posto migliore per aggiungere soluzioni o eventi di progetto, come ProjectAdded, a un componente aggiuntivo di Visual Studio?Dove devo allegare gli eventi di soluzione o di progetto nel mio componente aggiuntivo di Visual Studio?

Se eseguo questa operazione quando il componente aggiuntivo si collega, non è stata caricata alcuna soluzione, quindi come posso sapere quando è stata caricata una soluzione?

Ad esempio, se scrivo un evento per gestire gli elementi del progetto aggiunti, dove devo allegarlo? L'evento verrebbe attivato dal progetto e a sua volta dalla soluzione, quindi non è possibile collegare gli eventi quando il componente aggiuntivo si connette perché non vi è alcuna soluzione quando il componente aggiuntivo si connette.

D'altra parte, se li aggiungo nell'evento Exec(), allora ho bisogno di fare verifiche come se l'evento è già stato allegato, e sono sicuro che ci deve essere un modo più ordinato a volte tra la connessione eventi e l'evento Exec().

risposta

5

Probabilmente capito questo molto tempo fa, ma in ogni caso: è possibile impostare gli eventi dall'interno OnConnection come mostrato di seguito, questo è un frammento di classe Connect di un componente aggiuntivo (supponendo che si sta utilizzando 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 
} 

Il punto principale è, per collegare la soluzione e gli eventi di progetto necessari, non è importante se una soluzione o un progetto è già stato caricato. Non sono collegati a nessuna particolare soluzione o progetto, sono forniti dal modello a oggetti di Visual Studio e sono incorporati nello spazio dei nomi EnvDTE.

Non avrebbe molto senso per fare qualsiasi altra cosa in ogni caso, dal momento che è possibile configurare un componente aggiuntivo da caricare all'avvio di VS, e in questo caso non ci sarà mai mai alcun soluzioni/progetti caricati.

Ci sono alcune catture però:

  • E 'importante che si mantiene un riferimento alla classe SolutionEvents come variabile membro all'interno della vostra classe Connect, altrimenti the events will never fire, (see also here).
  • È necessario assicurarsi di controllare il parametro connectMode passato a OnConnection. Questo viene chiamato più volte con parametri diversi, e se lo fai nel modo sbagliato puoi far caricare l'evento più volte, il che sicuramente sarà un problema. Inoltre, solitamente qualsiasi ID add-in, come menu e materiale, è impostato da OnConnection, quindi potresti finire con voci di menu duplicate se non lo fai correttamente.

Ecco alcune indicazioni, parte del codice fornito è il codice VB, nel caso in cui siete alla ricerca di che:

Infine, ecco un elenco di articoli, circa il 70% di essi copre argomenti di base e avanzati riguardanti gli addin:

trovare la sezione intitolata MZ-Tools articoli della serie (circa add-in) e dare un'occhiata a ciò che è coperto lì.

Problemi correlati