Share via


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

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

前提条件

  • Visual Studio 2022 バージョン 17.9 Preview 1 以降 (ワークロードあり Visual Studio extension development )。

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

  • テンプレートを使用して VisualStudio.Extensibility Project 、新しい拡張プロジェクトを作成します。

Screenshot of the VSExtensibility template.

この時点で、拡張機能にコマンドとエディター コンポーネントを追加して、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 することもできます。 この属性は、実装するクラスまたは実装する IVisualStudioContributionClassIVisualStudioContributionPropertyの静的プロパティに適用できます。

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

テンプレートは、最初のコマンド ハンドラーとして作成 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 呼び出します。 引数またはthis.Extensibilityオブジェクトを使用contextして 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 新しいコマンドがあります。

    Screenshot showing sample command.

次のステップ

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

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