VisualStudio.Extensibilityを用いた拡張機能開発の導入

# VisualStudio.Extensibilityを用いた拡張機能開発の導入

## はじめに

作りたいものがあったため、VSの拡張機能開発してみようかなと思ったのがきっかけです。
せっかく作るのだから最新のやり方（VisualStudio.Extensibility）でやってみたいものの、日本語の記事がとくになかったため、良い機会だと思って記事化してみました。
自分も手探り状態なので、この記事をきっかけにさわってみて情報いただけると嬉しいです。

## 環境構築

以下のリンクに書いてあります、といえばそれまでなのですが、ちょくちょく詰まりポイントがあったため具体的にやったことを記します。
<https://learn.microsoft.com/ja-jp/visualstudio/extensibility/visualstudio.extensibility/get-started/create-your-first-extension?view=vs-2022>

- VisualStudioのバージョンアップ
  - 上のリンク先にも書いてありますが、以下のバージョン以降でないとサポートしていません。多くの人はアップデートする必要があるかと思います。VisualStudioの[ヘルプ]-[更新プログラムの確認]からVisualStudioをバージョンアップしておきましょう。また、Preview版でないと動きません。
    > Visual Studio 2022 バージョン 17.7 Preview 1 以降と .NET desktop development ワークロード
- デスクトップアプリ開発用ワークロードも必要です。VisualStudioInstallerを起動して、 .NET desktop development ワークロードのインストールもしましょう。
- VisualStudioの[拡張機能]-[拡張機能の管理]から、[VisualStudio.Extensibility Project System]をダウンロードします。ダウンロードした後は一旦VisualStudioを終了してインストールを待ちます。
- ここまで進めると、新しいプロジェクトの作成からVisualStudio.Extensibilityが選べるようになっているはずです。

## 新しいプロジェクトが2種類あるのですが？

新しいプロジェクトを作ろうとしたときに[VisualStudio.Extensibility Extension]と[VisualStudio.Extensibility Extension with VSSDK Compatibility]の2種類が増えています。
自分も正確に把握しているわけではないのですが、ドキュメントを当たると以下の違いがあるそうです。

- [VisualStudio.Extensibility Extension] : [アウトプロセス](https://learn.microsoft.com/ja-jp/visualstudio/extensibility/visualstudio.extensibility/get-started/oop-extensibility-model-overview?view=vs-2022)で実行する拡張機能のプロジェクト。VisualStudio プロセスの外部で実行されます。
- [VisualStudio.Extensibility Extension with VSSDK Compatibility] : [インプロセス](https://learn.microsoft.com/ja-jp/visualstudio/extensibility/visualstudio.extensibility/get-started/in-proc-extensions?view=vs-2022)で実行する拡張機能のプロジェクト。VisualStudio プロセスの内部で実行されます。

ソリューション エクスプローラーを見てみると、[VisualStudio.Extensibility Extension with VSSDK Compatibility]の場合はコンテナプロジェクトが増えることが分かりました。

どちらが良い方法かは不明ですが、インプロセスでなければ実現できない限りはアウトプロセスで実行する[VisualStudio.Extensibility Extension]の方がシンプルでやりやすそうでした。

以降の章では、[VisualStudio.Extensibility Extension]を用いて、実際に拡張機能を開発を進めます。

## 拡張機能の開発

[VisualStudio.Extensibility Extension]を選択して、プロジェクトを新規作成します。  
この段階で拡張機能の初期部分まではすでに実装されており、メニューが追加されていてシンプルなメッセージボックスを開く処理まで実装されています。

ただし、このままデバッグ実行しても著者の環境では以下のIssueのエラーが発生してしまいました。
<https://github.com/microsoft/VSExtensibility/issues/240>
そのため、以下のコードを`ExtensionEntrypoint`のコンストラクタに追加します。

```cs
...

namespace Extension1
{
    /// <summary>
    /// Extension entrypoint for the VisualStudio.Extensibility extension.
    /// </summary>
    [VisualStudioContribution]
    internal class ExtensionEntrypoint : Extension
    {
        public ExtensionEntrypoint()
        {
            // ★以下を追加
#if DEBUG
            // F5でデバッグ実行できないため、デバッグなし実行時にデバッガを起動させる
            // https://github.com/microsoft/VSExtensibility/issues/240
            System.Diagnostics.Debugger.Launch();
#endif
        }

        ...
    }
}

```

上記のコードを追加後にデバッグなし実行をすると、新規にVisualStudioが立ち上がります。
その後、[拡張機能]メニューを開くと[Sample Remote Command]メニューが追加されていることを確認できます。
[Sample Remote Command]メニューを実行すると[Just-In-Time デバッガーを選択する]ダイアログが表示されますので、エクステンションのプロジェクトを開いているVisualStudioを指定することでデバッグできます。
実行してみると、無事メッセージボックスが表示されることを確認できます。

## おわりに

まだまだプレビュー段階で上記の情報も古くなる可能性がありますが、お試しで触ってみるのも良いかと思いました。
利用できるAPIなどもまだ分かっていないので、自分もこれから色々と触ってみようと思います。