次の方法で共有


VisualStudio.Extensibility SDK と VSSDK の併用

VisualStudio.Extensibility モデルは主に devenv.exe プロセスの外部で拡張機能をホストするために作成されましたが、Visual Studio プロセスで実行されている拡張機能で VisualStudio.Extensibility SDK API を使用し、Microsoft.VisualStudio.Sdk パッケージによって提供される従来の機能拡張 API を利用できます。

インプロセス の使用のサポートは、新しい VisualStudio.Extensibility API の早期導入者が、機能ギャップをカバーするために Microsoft.VisualStudio.Sdk を利用できるようにすることを目的としています。

このドキュメントは、VisualStudio.Extensibility SDK in-proc を利用するためのさまざまなオプションに関する簡単なチュートリアルです。

  • 新しい拡張機能を開発する場合は、このチュートリアルの に従って、インプロセスでホストされる VisualStudio.Extension作成することをお勧めします。 このメソッドを使用すると、VSSDK および MEF サービスを挿入できるだけでなく、VisualStudio.Extensibility SDK のすべての機能を使用できます。

  • 既存の VSSDK 拡張機能がある場合は、これらのヒント 従って、拡張機能の新しい VisualStudioExtensibility インスタンスを使用できます。

  • VisualStudio.Extensibility SDK を使用して、コマンド、デバッグ ビジュアライザー、ツール ウィンドウを既存の VSSDK 拡張機能に追加する場合は、VSSDK 拡張機能と VisualStudio.Extensibility 拡張機能の両方を同じ VS 拡張機能プロジェクトでホストするために これらのヒント 参照できます。

初めての VSSDK と互換性のある VisualStudio.Extensibility 拡張機能を作成する

VisualStudio.Extensibility モデルは主に devenv.exe プロセスの外部で拡張機能をホストするために作成されましたが、Visual Studio 2022 17.4 Preview 1 以降では、devenv.exe 内でホストされ、Microsoft.VisualStudio.Sdk パッケージによって提供される従来の拡張 API を使用できる VisualStudio.Extensibility 拡張機能を構築できます。

前提 条件

  • Visual Studio 2022 バージョン 17.9 Preview 1 以降と Visual Studio extension development ワークロード。
  • 以前のビルドから更新する場合は、潜在的な競合を回避するために、必ず VisualStudio.Extensibility Project System をアンインストールしてください。

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

  • VisualStudio.Extensibility Extension with VSSDK Compatibility テンプレートを使用して、新しいソリューションを作成します。

VisualStudio.Extensibility in-process extension プロジェクト テンプレートのスクリーンショット。

拡張機能をデバッグする

  • F5 を押してデバッグを開始すると、拡張機能がビルドされ、使用している Visual Studio バージョンの実験用インスタンスにデプロイされます。 拡張機能が読み込まれたら、デバッガーをアタッチする必要があります。

  • 次の図に示すように、コマンド Extensions メニューにあります。

    拡張機能コマンドのサンプルを示すスクリーンショット。

VisualStudio.Extensibility 拡張機能からの Visual Studio SDK サービスの使用

VS-SDK と互換性のある拡張機能プロジェクトは、Microsoft.VisualStudio.Sdk パッケージを参照します。これにより、すべての Visual Studio SDK のサービスにアクセスできます。

従来、このようなサービスは、MEF または AsyncServiceProviderによって使用されます。 代わりに、.NET 依存関係の挿入には VisualStudio.Extensibility エクステンダーをお勧めします。

MefInjection<TService> クラスと AsyncServiceProviderInjection<TService, TInterface> クラス (Microsoft.VisualStudio.Extensibility.VSSdkCompatibility 名前空間の両方) を使用すると、依存関係の挿入によってインスタンス化されるクラスのコンストラクター (コマンド、ツール ウィンドウ、拡張パーツなど) に追加することで、Visual Studio SDK のサービスを使用できます。

次の例は、DTE2 サービスと IBufferTagAggregatorFactoryService サービスをコマンドに追加する方法を示しています。

    [VisualStudioContribution]
    public class Command1 : Command
    {
        private TraceSource traceSource;
        private AsyncServiceProviderInjection<DTE, DTE2> dte;
        private MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService;

        public Command1(
            VisualStudioExtensibility extensibility,
            TraceSource traceSource,
            AsyncServiceProviderInjection<DTE, DTE2> dte,
            MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService)
            : base(extensibility)
        {
            this.dte = dte;
            this.bufferTagAggregatorFactoryService = bufferTagAggregatorFactoryService;
        }
    
        public override CommandConfiguration CommandConfiguration => new("Sample Remote Command")
        {
            Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
            Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        };

VSSDK と互換性のある VisualStudio.Extensibility 拡張機能の構造

VisualStudio.Extensibility Extension with VSSDK Compatibility テンプレートを使用すると、プロジェクト全体のセットアップが行われますが、VS-SDK と互換性のある VisualStudio.Extensibility 拡張機能の基本的なコンポーネントと、それが「最初の拡張機能の作成」ガイド で説明されている一般的なバリアントとどのように異なるかを知ると便利です。

TargetFramework と VssdkCompatibleExtension

拡張プロジェクトは、ターゲットの Visual Studio バージョンで使用される .NET バージョンを対象とする必要があります。 Visual Studio 2022 の場合、.NET Framework 4.7.2 をターゲットにする必要があります。

拡張プロジェクトには、trueに設定された VssdkCompatibleExtension プロパティも含まれている必要があります。

<PropertyGroup>
  <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>

RequiresInProcessHosting プロパティ

Extension クラスは、"インプロセス" として拡張機能を識別する RequiresInProcessHosting = true プロパティを構成する必要があります。

[VisualStudioContribution]
internal class MyExtension : Extension
{
    public override ExtensionConfiguration? ExtensionConfiguration => new()
    {
        RequiresInProcessHosting = true,
    };

    ...

パッケージ マニフェスト

拡張プロジェクトには、source.extension.vsixmanifestという名前の パッケージ マニフェスト 含める必要があります。 Installation タグは ExtensionTypeVSSDK+VisualStudio.Extensibilityに設定する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
    <Metadata>
        <Identity Id="MyExtensionId.f14b8c45-154f-4584-abd7-9ec22af003e2" Version="1.0" Language="en-US" Publisher="Microsoft" />
        <DisplayName>My extension</DisplayName>
        <Description xml:space="preserve">My extension's description.</Description>
    </Metadata>
    <Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
        <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
            <ProductArchitecture>amd64</ProductArchitecture>
        </InstallationTarget>
      <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
        <ProductArchitecture>arm64</ProductArchitecture>
      </InstallationTarget>
    </Installation>
    <Prerequisites>
        <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
    </Prerequisites>
    <Assets>
        <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
    </Assets>
</PackageManifest>

既存の VSSDK 拡張機能から VisualStudio.Extensibility を使用する

既存の VSSDK 拡張機能の場合、もう 1 つのオプションは、サービス プロバイダーを介して VisualStudioExtensibility インスタンスを照会し、そのメソッドを利用することです。 このメソッドを使用すると、既存のコンポーネントで VisualStudio.Extensibility SDK の新しい API サーフェス領域を使用できます。 このオプションは、新しい VISUALStudio.Extensibility ベースの拡張機能を作成せずに、新しい API を使用してプロジェクト情報のクエリを実行したり、ドキュメント管理を行う場合に役立ちます。

VSSDK パッケージ内で VisualStudioExtensibility を利用する方法を示すコード スニペットの例を次に示します。

  • .csproj ファイルに、VisualStudio.Extensibility API へのパッケージ参照を含めます。
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.2092" />
  </ItemGroup>
  • パッケージまたは他のコンポーネントの GetServiceAsync メソッドを使用して、visualStudioExtensibility インスタンス クエリを実行できるようになりました。
...
using Microsoft.VisualStudio.Extensibility;
...

public class VSSDKPackage : AsyncPackage
{
    protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
    {
        VisualStudioExtensibility extensibility = await this.GetServiceAsync<VisualStudioExtensibility, VisualStudioExtensibility>();
        await extensibility.Shell().ShowPromptAsync("Hello from in-proc", PromptOptions.OK, cancellationToken);
        ...
    }
}

VisualStudio.Extensibility 拡張機能を既存の VSSDK 拡張機能プロジェクトに追加する

既存の VSSDK 拡張機能内で VisualStudio.Extensibility SDK を使用してツール ウィンドウやエディター リスナーなどのコンポーネントを提供する場合は、追加の手順に従って、プロジェクトに VisualStudio.Extensibility Extension インスタンスを作成する必要があります。

  • VisualStudio.Extensibility SDK パッケージを利用するには、SDK スタイルの .csproj が必要です。 既存のプロジェクトの場合は、.csproj を SDK スタイル 1 に更新することが必要になる場合があります。

  • Microsoft.VSSDK.BuildTools のパッケージ参照を削除し、代わりに VisualStudio.Extensibility のパッケージ参照を追加します。

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" />
  • プロパティ VssdkCompatibleExtension プロジェクト ファイルに追加し、trueに設定します。 このプロパティを使用すると、互換性のために一部の VSSDK 機能が有効になります。
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • 基底クラスから継承する新しい拡張クラス Extension 作成し、前に示すように RequiresInProcessHosting プロパティ 設定します。
  • Installation タグに ExtensionType="VSSDK+VisualStudio.Extensibility" を追加する source.extension.vsixmanifest ファイルを変更します。
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

VisualStudio.Extensibility のすべての機能を既存の VSSDK 拡張機能と共に使用できるようになりました。