2010-08-12 9 views
5

¿Alguien puede sugerir el mejor lugar para agregar eventos de solución o proyecto, como ProjectAdded, a un complemento de Visual Studio?¿Dónde debería adjuntar eventos de solución o proyecto en mi complemento de Visual Studio?

Si hago esto cuando el complemento se conecta entonces no hay una solución cargada, entonces ¿cómo puedo saber cuándo se ha cargado una solución?

Por ejemplo, si escribo un evento para manejar los elementos del proyecto que se están agregando, ¿dónde debería adjuntarlo? El evento sería activado por el proyecto y, a su vez, por la solución, por lo que no puedo adjuntar los eventos cuando el complemento se conecta porque no hay solución cuando el complemento se conecta.

Por otro lado, si los agrego en el evento Exec(), entonces necesito hacer comprobaciones, como si el evento ya se ha adjuntado, y estoy seguro de que debe haber una manera más ordenada en algún momento entre la conexión eventos y el evento Exec().

Respuesta

5

Probablemente cuenta de esto hace mucho tiempo, pero de todos modos: Puede configurar sus eventos desde dentro OnConnection como se muestra a continuación, se trata de un fragmento de la clase Connect de un complemento (asumiendo que usted está usando 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 
} 

El punto principal es que para conectar la solución y los eventos del proyecto que necesita, no es importante si una solución o proyecto ya está cargado. No están adjuntos a ninguna solución o proyecto en particular, son proporcionados por el modelo de objetos de Visual Studio y están integrados dentro del espacio de nombres EnvDTE.

No tendría mucho sentido hacer otra cosa de todos modos, ya que puede configurar un complemento para cargar cuando se inicia VS, y en este caso nunca habrá soluciones/proyectos cargados.

Hay algunas capturas sin embargo:

  • Es importante que mantenga una referencia a la clase SolutionEvents como una variable miembro dentro de su clase de conexión, de lo contrario the events will never fire, (see also here).
  • Debe asegurarse de marcar el parámetro connectMode pasado al OnConnection. Esto se llama varias veces con diferentes parámetros, y si lo haces de la manera incorrecta, puedes conectar el evento varias veces, lo que definitivamente será un problema. Además, generalmente cualquier Addin IDE, como menús y cosas, se configura desde OnConnection, por lo que puede terminar con elementos de menú duplicados si no lo hace bien.

Aquí hay algunas sugerencias, una parte del código proporcionado es el código de VB, en caso de que usted está buscando para ello:

Finalmente, aquí hay una lista de artículos, alrededor del 70% de ellos cubre temas básicos y avanzados con respecto a complementos:

encontrar la sección titulada MZ-Tools serie de artículos (acerca de complementos) y echar un vistazo a lo que se cubran.

Cuestiones relacionadas