初めてのVisual Studio拡張機能を作成する

このドキュメントは、VisualStudio.Extensibility を使用して最初の拡張機能を作成する方法を示すクイック スタートです。 拡張機能はアウトプロセスで実行されます。つまり、Visual Studio プロセスの外部を意味します。

前提条件

  • Visual Studio extension development ワークロードを含む Visual Studio 2022 バージョン 17.9 Preview 1 以降のバージョン

拡張プロジェクトを作成する

  • VisualStudio.Extensibility Project テンプレートを使用して、新しい機能拡張projectを作成します。

VSExtensibility テンプレートのスクリーンショット。

この時点で、拡張機能にコマンドとエディター コンポーネントを追加して、Visual Studioの拡張を開始する準備ができました。

Extension クラス

テンプレートは、 Extensionを拡張するクラスを作成します。 このクラスは、拡張機能の読み込み時にインスタンス化される最初のクラスです。 InitializeServices メソッドでは、独自のサービスをサービス コレクションに追加して、依存関係の挿入に使用できるようにします。

[VisualStudioContribution]
internal class ExtensionEntrypoint : Extension
{
    protected override void InitializeServices(IServiceCollection serviceCollection)
    {
        base.InitializeServices(serviceCollection);

        // You can configure dependency injection here by adding services to the serviceCollection.
    }
}

また、Visual Studioによって使用される拡張コンポーネントのマークに使用される VisualStudioContribution 属性も確認できます。 この属性は、IVisualStudioContributionClassを実装する型のIVisualStudioContributionPropertyまたは静的プロパティを実装するクラスに適用できます。

最初のコマンドを追加する

テンプレートは、最初のコマンド ハンドラーとして Command1.cs を作成します。これは、開始点として使用できます。 このコマンドをVisual Studio認識し、Command クラスが IVisualStudioContributionClass を実装するため、コマンドは VisualStudioContribution 属性でマークされます。

[VisualStudioContribution]
internal class Command1 : Command
{

このコマンドには、 CommandConfigurationという名前の構成プロパティがあり、 Extensions メニューの表示名、アイコン、配置を定義します。

    public override CommandConfiguration CommandConfiguration => new("%MyExtension.Command1.DisplayName%")
    {
        // Use this object initializer to set optional parameters for the command. The required parameter,
        // displayName, is set above. DisplayName is localized and references an entry in .vsextension\string-resources.json.
        Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
    };

構成プロパティは、拡張機能をビルドするときに C# コンパイラによって評価され、その値は拡張機能のメタデータとして保存されるため、Visual Studioは拡張機能アセンブリを読み込まずに読み取ることができます。 このため、構成プロパティには、通常のプロパティと比べて追加の制約があります(たとえば、読み取り専用である必要があります)。

コマンドの表示名が"%MyExtension.Command1.DisplayName%"され、MyExtension.Command1.DisplayName ファイル内の.vsextension/string-resources.json文字列を参照し、この文字列をローカライズできることがわかります。

コマンドが実行されると、Visual Studio はブレークポイントを設定できる ExecuteCommandAsync メソッドを呼び出します。 context 引数または this.Extensibility オブジェクトを使用して、Visual Studioを操作できます。

たとえば、コマンド ハンドラーは次のようになります。

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
    await context.ShowPromptAsync(
        "Hello from an extension!", 
        PromptOptions.OK, 
        cancellationToken);
}

コマンドを追加する方法の詳細については、「 コマンド 」セクションを参照してください。

拡張機能をデバッグする

  1. Visual Studioで拡張機能プロジェクトがスタートアップ プロジェクトとして選択されていることを確認し、F5 キーを押してデバッグを開始します。

  2. F5 キーを押すと、拡張機能がビルドされ、使用している Visual Studio のバージョンの実験用インスタンスにデプロイされます。 拡張機能が読み込まれると、デバッガーがアタッチされます。

  3. 次の図に示すように、 Extensions メニューに新しいコマンドがあります。

    Visual Studio でのサンプル コマンドを示すスクリーンショット。

    サンプル コマンドを示すスクリーンショット。

次のステップ

概要を見逃した場合は、 VisualStudio.Extensibility ドキュメントへようこそを参照してください。

ここで、もう少し興味深い拡張機能を作成します。 「単純な拡張機能を作成する」を参照してください。