昔々、私はアドイン/VSIX パッケージ/MEF 開発者でした...
答えはすぐにノーですが、私は長い道のりでそれをしなければなりません:
アドイン、パッケージ (管理されているかどうかに関係なく) は、VS サービス レベルに個別にアクセスできます。すべてのエラーは報告者に属しているため (報告者が Chirpy のように管理している場合)、Chirpy 2.0 によって作成されたエラーを処理することはできません。
そのソース コードをいくつか見てみると、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);
}
}
}
}
ご覧のとおり、結果のクリアは多くのことに依存します。最初に設定します(GUIまたは構成のどこに設定するかわかりませんが、チェックボックスから値を取得するようです)。2 番目の名前の配列には、すべてのビルド コマンド名が含まれているわけではありません。
したがって、解決策が表示されますが、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);
}
}
};
または、ラムダ式の代わりに同等のハンドラー メソッドを使用します。Chirp クラスのサブスクリプション OnStartupComplete メソッドに配置する必要があります。
購読解除は、同じクラスの OnDisconnection メソッドに配置する必要があります。(他のすべてのサブスクライブされたハンドラーについては...)
アップデート:
アドインが切断されても、Studio がすぐに閉じられるわけではありません。アドインをアンロードできました。そのため、OnDisconneconnection からも RemoveAll を呼び出す必要があります。(または、TaskList を削除して破棄する...)
アップデート2:
カスタム コマンドを作成して、ホットキーにバインドすることもできます。