Куда я должен прикрепить события решения или проекта в моей надстройке Visual Studio? - PullRequest
5 голосов
/ 12 августа 2010

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

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

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

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

1 Ответ

5 голосов
/ 06 июля 2011

Вы, наверное, поняли это давно, но в любом случае: вы можете настроить свои события из OnConnection, как показано ниже, это фрагмент класса Addin's 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 в качестве переменной-члена в вашем классе соединения, в противном случае события никогда не сработают , ( см. Также здесь ).
  • Необходимо убедиться, что вы проверяете параметр connectMode, переданный в OnConnection.Это вызывается несколько раз с разными параметрами, и если вы сделаете это неправильно, вы можете подключить событие несколько раз, что определенно будет проблемой.Кроме того, обычно любая Addin IDE, такая как Menus и прочее, настраивается в пределах OnConnection, поэтому вы можете получить дубликаты пунктов меню, если не сделаете это правильно.

ВотНесколько указателей, часть предоставленного кода - это VB-код, на случай, если вам это нужно:

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

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

...