曾几何时,我是一个加载项/VSIX 包/MEF 开发人员...
答案很快是否定的,但我必须长期这样做:
加载项、包(托管或非托管)可以分别访问 VS 服务级别。每个错误都属于报告者(如果他们像 Chirpy 那样管理它们),因此您无法处理由 Chirpy 2.0 创建的错误
我仔细看了一下它的源代码,它坚持它是由名为 TaskList 的 Singleton 集合中的工具获得的。
在最新版本中,通过 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);
}
}
}
}
如您所见,清除结果取决于许多事情。首先是设置(我不知道在 GUI 或配置上设置的位置,但似乎从复选框中获取它的值)。其次,不包含每个构建命令名称的名称数组。
所以我看到了一个解决方案,但只是在从 Chirpy 修改和重建/重新部署您自己的版本(并提出拉取请求)的路上:
代码不依赖于命令及其名称。(例如缺少重建)
您可以像这样更改上面的方法:
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);
}
}
};
或者使用等效的处理程序方法而不是 lambda 表达式。您应该将其放入 Chirp 类的订阅 OnStartupComplete 方法中。
取消订阅必须放在同一个类的 OnDisconnection 方法中。(至于所有其他订阅的处理程序......)
更新:
当插件断开连接时,并不意味着工作室将立即关闭。可以卸载加载项。所以你也应该从 OnDisconneconnection 调用 RemoveAll。(或删除并处置任务列表...)
更新2:
您还可以制作自定义命令,并将其绑定到热键。