VisualStudio.Extensibilityを用いて拡張機能を作ってみた
はじめに
前回記事でVisualStudio.Extensibilityという作り方の導入を紹介しました。
その後もちょくちょく触り、最低限元々やりたかったことは形になってきましたので、成果の共有も含めてご紹介しようと思います。
ただ、配布方法などもわかっておらず、デバッグでしか動かせないです。。。公式ドキュメントにも紹介されていないのですが、詳しい方がもしいらっしゃれば教えていただけると幸いです。
やりたいこと
デバッグ中のアプリがあったら強制終了→ビルド→デバッグ実行をワンクリック・ワンコマンドで実行、です。
WPF開発をしているとデバッグ中に見た目やロジックをいじったりした後に、デバッグを停止→ビルドして実行、ということをよくします。実質2ステップではあるのですが、それが一発でできたら楽だな~と思ったのがきっかけです。
あと、デバッグなし実行で動かしているのを忘れてビルドしようとしたら裏でプロセスを掴んでいてビルドに失敗することもあります。
アプリの規模が大きくなるほどビルドに時間がかかるので、一発で確実に動かせるのは個人的にかなり助かります。
試作中の拡張機能
以下が作成中の拡張機能です。
https://github.com/niimima/MySampleExtension/tree/main
[Force Debug]コマンドを実行することで、やりたいことの一連の動きをやってくれます。ただ、かなり穴だらけのプログラムなので思わぬ挙動になる可能性もありますのでご注意ください。
拡張機能を作るにあたり学んだこと
ショートカットキーを利用する
上記のGIF画像ではメニューから実行していましたが、ショートカットキーからも実行できます。既存のショートカットキーと重複すると動かないようでしたので、自分は[LeftAlt]+[F5]キーで動かせるようにしました。
以下のURLに示す通り、CommandConfiguration の Shortcuts プロパティに設定することでショートカットキーを設定できました。
https://github.com/niimima/MySampleExtension/blob/main/src/MySampleExtension/MySampleExtension/ForceDebugCommand.cs#L39
プロジェクトから情報を取得する
VisualStudio.Extensibility ではクエリを用いてプロジェクトから取得したいパラメータを指定します。プロジェクト名やパス、ファイル名などなどいろんな情報が取得できるようです。
https://github.com/niimima/MySampleExtension/blob/main/src/MySampleExtension/MySampleExtension/ForceDebugCommand.cs#L55
APIでできることには以下に整理されています。が、正直自分にはいまいち理解しきれていないです。。
https://learn.microsoft.com/ja-jp/visualstudio/extensibility/visualstudio.extensibility/project/project-concepts?view=vs-2022
https://learn.microsoft.com/ja-jp/visualstudio/extensibility/visualstudio.extensibility/project/project?view=vs-2022
ソリューションから情報取得・コマンド実行
以下ではプロジェクトから情報を取得するのと同様の方法で、ソリューションからも情報を取得できます。
https://github.com/niimima/MySampleExtension/blob/main/src/MySampleExtension/MySampleExtension/ForceDebugCommand.cs#L85
また、ビルドやデバッグの実行なども実行できます。ただ、コマンドを実行するにはQueryableに変換する必要があるようなのですが、そこの使い分けが自分にはまだわかっていないです。
自分の理解で伝えると、一度情報を取得するとその時点の情報はとれるがプロセス間のやり取りが切れてしまっている状態なので、もう一度つなぎ直すためにQueryableに変換しているイメージです。
https://github.com/niimima/MySampleExtension/blob/main/src/MySampleExtension/MySampleExtension/ForceDebugCommand.cs#L96-L97
おわりに
色々と手探りではありますが、とりあえずひとつ拡張機能を作ることができました。
ただ、プレビュー機能で配布することもできないので、公式な Visual Studio でも動作するようになることを楽しみにしています!