Когда-то я был разработчиком пакета Add-In / VSIX / MEF ...
В скором времени ответ будет отрицательным, но я должен сделать это на долгом пути:
Надстройки, пакеты (управляемые или нет) имеют отдельный доступ к уровню обслуживания VS. Каждая ошибка принадлежит репортеру (если они управляют ими, как это делает Chirpy), поэтому вы не можете обрабатывать ошибки, созданные Chirpy 2.0
Я несколько смотрю на его исходный код, и он настаивает на своих ошибках, полученных инструментами из коллекции Singleton под названием TaskList.
Удаление элементов коллекции происходит в нескольких частях кода в последней версии с помощью метода RemoveAll:
Первый: после того, как растворение закрыто.
этим:
private static string[] buildCommands = new[] { "Build.BuildSelection", "Build.BuildSolution", "ClassViewContextMenus.ClassViewProject.Build" };
private void CommandEvents_BeforeExecute(string guid, int id, object customIn, object customOut, ref bool cancelDefault) {
EnvDTE.Command objCommand = default(EnvDTE.Command);
string commandName = null;
try {
objCommand = this.App.Commands.Item(guid, id);
} catch (System.ArgumentException) {
}
if (objCommand != null) {
commandName = objCommand.Name;
var settings = new Settings();
if (settings.T4RunAsBuild) {
if (buildCommands.Contains(commandName)) {
if (this.tasks != null) {
this.tasks.RemoveAll();
}
Engines.T4Engine.RunT4Template(this.App, settings.T4RunAsBuildTemplate);
}
}
}
}
Как видите, чистота результатов зависит от многих факторов.
Сначала о настройке (которую я не знаю, где установить в графическом интерфейсе или конфигах, но, похоже, его значение формируется из флажка).
Во-вторых, массив имен, которые не содержат каждое имя команды сборки.
Так что я вижу решение, но только на пути изменения и перестройки / повторного развертывания вашей собственной версии из Chirpy (и сделать запрос Pull):
Код не должен зависеть от команд и их имен. (пересборки отсутствуют, например)
Вы можете изменить метод выше примерно так:
this.eventsOnBuild.OnBuildBegin += ( scope, action ) =>
{
if (action != vsBuildAction.vsBuildActionDeploy)
{
if (this.tasks != null)
{
this.tasks.RemoveAll();
}
if (settings.T4RunAsBuild && action != vsBuildAction.vsBuildActionClean)
{
Engines.T4Engine.RunT4Template(this.App, settings.T4RunAsBuildTemplate);
}
}
};
Или с помощью другого эквивалентного метода-обработчика вместо лямбда-выражения.
Вы должны поместить его в метод OnStartupComplete подписки класса Chirp.
Отмена подписки должна быть помещена в метод OnDisconnection в том же классе. (Как и для всех других обработчиков с подпиской ...)
Обновление:
Когда надстройка отключена, это не означает, что Studio будет закрыта немедленно. Надстройка может быть выгружена. Так что вам следует также вызвать RemoveAll из OnDisconneconnection. (Или удалите и утилизируйте TaskList ...)
Update2:
Вы также можете создать собственную команду и привязать ее к горячей клавише.