コード生成を行う Visual Studio カスタムツール(拡張機能)の実装

July 7, 2025 11:17

参考

カスタム ツール
How to register "custom tool" with Visual Studio 2017 or Visual Studio 2019 to make it work?

How to create a Custom Tool or Single File Generator in Visual Studio 2017:

Follow below steps to create a Custom Tool in VS2017:

  1. We need to create a VSIX extension
  2. Add new Visual Studio Package
  3. Implement IVsSingleFileGenerator
  4. Add the registry entry code
  5. Compile and test the tool by running it in VS2017
  6. Install the tool by double clicking the generated .VSIX file

Visual Studio 2017 向けの回答だが、2022 でも同様の方法で作成できる。

実装

  1. VSIX Project を新規作成
    source.extension.vsixmanifest
    で Product Name や Description を設定

  2. VSIX Project をスタートアッププロジェクトに設定してデバッグ開始
    新しい Visual Studio が起動されるので、拡張機能 > 拡張機能の管理 > インストール済み
    に 1. で設定した Product Name や Description が表示されることを確認
    ※この Visual Studio は拡張機能デバッグ用の設定を使用しているので、拡張機能がインストールされている状態になっているが、オリジナルの Visual Studio にはインストールされない

  3. コード生成処理の実装
    ○○○○.cs を追加
    以下が最小単位のコード
    ・Guid は新たな値を生成する必要あり
    ・CodeGeneratorRegistration の "" は変更してはいけない

○○○○.cs
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration(nameof(○○○○), "Sample", "1.0")]
[Guid("562513EE-B2A8-426E-9E63-ABDE0C3914DD")]
[ProvideObject(typeof(○○○○))]
[CodeGeneratorRegistration(typeof(○○○○), nameof(○○○○), "{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}", GeneratesDesignTimeSource = true)]
public class ○○○○ : BaseCodeGeneratorWithSite
{
    public override string GetDefaultExtension() => ".txt";

    protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
    {
        byte[] bytes = Encoding.UTF8.GetBytes("あいうえお");
        return bytes;
    }
}

デバッグ

  1. GenerateCode にブレークポイントを設定してデバッグ開始
  2. 新しい Visual Studio が起動されるので新規プロジェクトを作成、*.cs ファイルを適当に作成
  3. *.cs ファイルのカスタムツールに「○○○○」を設定
  4. このタイミングで GenerateCode のブレークポイントに止まればOK
  5. そのまま実行を継続すると、 *.cs の子ファイルとして *.txt ファイルが作成される(内容は「あいうえお」)

備考など

以下のように null を return することでデフォルトのファイル出力は行われない。
StreamWriter などを使用すれば任意の場所にファイル出力できる。

return bytes;
↓
return null;

以下のコードでソリューションのフォルダを取得できる。

Path.GetDirectoryName(Dte.Solution.FullName)

デバッグ時は以下のコマンドで Visual Studio が起動されている。
コマンドラインから起動すればデバッグ時と同様の拡張機能がインストールされた状態で起動されるので、開発中の拡張機能の削除も可能。

C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe /rootsuffix Exp

Visual Studio 2022 の場合、前者が本体の拡張機能インストールフォルダ、後者が拡張機能開発用の拡張機能インストールフォルダ。
「17.0_52f2a0d5Exp」はフォルダごと削除してもデバッグ実行で再度自動生成される。

C:\Users\hoge\AppData\Local\Microsoft\VisualStudio\17.0_52f2a0d5
C:\Users\hoge\AppData\Local\Microsoft\VisualStudio\17.0_52f2a0d5Exp 

参考

Single File Generator sample
AddAnyFilePackage.cs