Как программно переопределить действия сборки и запуска?

Я создал настраиваемый шаблон проекта, связанный с настраиваемым типом проекта. Решение в значительной степени зависит от MPF for Projects — Visual Studio 2012 framework.

Далее я хотел бы переопределить события «Сборка» (F6) и «Начать без отладки» (ctrl + F6) по умолчанию для этого пользовательского типа проекта. Само решение будет развернуто как пакет VSIX.

Любая помощь приветствуется.


comment
Что вы хотите, чтобы эти ключи делали вместо этого? Может быть способ интегрировать то, что вы хотите, чтобы они делали, в обычные пути.   -  person Jason Malinowski    schedule 10.04.2013
comment
@JasonMalinowski Я хочу использовать внешний компилятор вместе с некоторой пользовательской логикой в ​​​​зависимости от типов файлов, добавленных в проект.   -  person Dante    schedule 10.04.2013
comment
Должна ли эта настройка выполняться через msbuild вместо любых типов проектов VS? Что, по вашему мнению, произойдет, если пользователь будет выполнять сборку из командной строки или из своего любимого процесса сборки с непрерывной интеграцией?   -  person Jason Malinowski    schedule 10.04.2013
comment
@JasonMalinowski Я не совсем понимаю первый вопрос. Я хочу использовать внешний компилятор (ы) для создания моего проекта на основе расширений файлов в пользовательском типе проекта.   -  person Dante    schedule 10.04.2013
comment
Ах, может быть, я неправильно понял. Вы создаете тип проекта для принципиально нового языка или реализуете какие-то причудливые трюки поверх C#/VB/C++/и т. д.?   -  person Jason Malinowski    schedule 11.04.2013


Ответы (1)


Вы можете перехватить любую команду, поступающую из пользовательского интерфейса Visual Studio в VSPackage. Для этого следует подписаться на нужное событие DTE.Events.CommandEvents. Вы должны передать GUID и идентификатор в CommandEvents.

private void Initialize()
{
  var dte = GetService(typeof(SDTE)) as EnvDTE.DTE;
  _startCommandEvents = dte.Events.CommandEvents["{5EFC7975-14BC-11CF-9B2B-00AA00573819}", 295];
  _startCommandEvents.BeforeExecute += OnLeaveBreakMode;
}

private void OnBeforeStartCommand(string guid, int id, object customIn, object customOut, ref bool cancelDefault)
{
  //your event handler this command
}

Ваш обработчик событий имеет параметр ref bool cancelDefault, передавая в cancelDefault значение TRUE, вы отменяете команду VS, тем самым заменяя поведение VS своим.

Чтобы получить команду GUID и Id, вы можете использовать функцию ведения журнала VSIP. Чтобы включить эту функцию, установите значение ключа реестра:

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\<version>\General] "EnableVSIPLogging"=dword:00000001 

и перезапустите интегрированную среду разработки Visual Studio. Затем, используя Ctrl-Shift, щелкните пункт меню, и вы получите сообщение, подобное этому:

Guid и Id команда

Guid и CmdID из сообщения являются обязательными параметрами для CommandEvents.

Если вы внедряете новый язык (создаете новый тип проекта), правильнее добавить пользовательский механизм отладки и интеграцию с MSBuild. Вы можете увидеть примеры такой реализации в IronPython или проекты Nemerle.

person Mikhail Shcherbakov    schedule 14.04.2013