2010-08-12 2 views
5

Может ли кто-нибудь предложить лучшее место для добавления решений или событий проекта, таких как ProjectAdded, в надстройку Visual Studio?Где я должен прикреплять решения или события проекта в моей надстройке Visual Studio?

Если я делаю это, когда надстройка подключается, тогда нет загруженного решения, так как я могу узнать, когда было загружено решение?

Например, если я пишу событие для обработки добавляемых элементов проекта, где я должен это прикреплять? Событие будет запущено проектом, а это, в свою очередь, решением, поэтому я не могу присоединить события, когда надстройка подключается, потому что нет никакого решения при подключении надстройки.

С другой стороны, если я добавлю их в событие Exec(), мне нужно выполнить проверки, например, было ли это событие уже прикреплено, и я уверен, что между соединением должен быть более аккуратный способ события и событие Exec().

ответ

5

вероятно Вы поняли это давно, но в любом случае: Вы можете настроить свои события изнутри OnConnection, как показано ниже, это фрагмент из класса Connect надстройки (при условии, что вы используете 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 
} 

Главное, чтобы подключить решение и события проекта, которые вам нужны, не важно, если решение или проект уже загружены. Они не привязаны ни к какому-либо конкретному решению или проекту, они предоставляются объектной моделью Visual Studio и встроены в пространство имен EnvDTE.

В любом случае не имеет смысла делать что-либо еще, поскольку вы можете настроить аддон для загрузки при запуске VS, и в этом случае никогда не будет загружено никаких проектов/проектов.

Там в несколько уловы, хотя:

  • Это важно, что вы сохраняете ссылку на класс SolutionEvents в качестве переменной-члена в вашу связную класса, в противном случае the events will never fire, (see also here).
  • Вам необходимо убедиться, что вы проверили параметр connectMode, переданный в OnConnection. Это вызвано несколько раз с разными параметрами, и если вы сделаете это неправильно, вы можете получить событие, подключенное несколько раз, что определенно будет проблемой. Кроме того, обычно любая Addin IDE, например меню и т. Д., Настраивается в пределах OnConnection, поэтому вы можете получить дубликаты пунктов меню, если не делаете это правильно.

Вот несколько указателей, некоторые из кода при условии является VB код, в случае, если вы ищете что:

Наконец, вот список статей, около 70% из них охватывают основные и расширенные темы, касающиеся добавлений:

Найти раздел, озаглавленный MZ-Tools Статьи Series (о надстроек) и посмотреть на то, что там накрывали.