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