Visual Studio の拡張機能を Visual Studio 2022 用に更新する

重要

この記事のアドバイスにより、Visual Studio 2019 と Visual Studio 2022 の両方で動作させるために大きな変更を必要とする拡張機能の移行について、開発者にガイドを示すことができます。 そのような場合は、2 つの VSIX プロジェクトと条件付きコンパイルを使用することをお勧めします。

多くの拡張機能は、軽微な変更を行えば Visual Studio 2019 と Visual Studio 2022 の両方で動作するようになり、この記事にある拡張機能の最新化に関するアドバイスに従う必要はありません。 ご自身の拡張機能を Visual Studio 2022 で試し、ご自身の拡張機能に最適なオプションは何かを評価してください。

Visual Studio 2022 は 64 ビット アプリケーションであり、Visual Studio SDK にいくつかの破壊的変更が加えられています。 この記事では、現在の Visual Studio 2022 のプレビューで拡張機能を動作させるために必要な手順について説明します。 そうすることで、Visual Studio 2022 が一般公開される前に、ユーザーが拡張機能をインストールする準備を整えることができます。

Visual Studio をインストールして拡張機能をコンパイルする

Visual Studio 2022 のダウンロードから Visual Studio 2022 をインストールします。

.NET 言語で記述された拡張機能

マネージド拡張機能用の Visual Studio 2022 をターゲットとする Visual Studio SDK は、NuGet にのみ用意されています。

  • Microsoft.VisualStudio.Sdk (17.x バージョン) メタパッケージには、必要な参照アセンブリのほとんどまたはすべてが含まれています。
  • Microsoft.VSSDK.BuildTools (17.x バージョン) パッケージは、Visual Studio 2022 準拠の VSIX をビルドできるように VSIX プロジェクトから参照する必要があります。

破壊的変更を参照しない場合でも、Any CPU または x64 プラットフォームでは拡張機能をコンパイルする "必要があります"。 x86 プラットフォームは、Visual Studio 2022 の 64 ビット プロセスと互換性がありません。

C++ で記述された拡張機能

C++ でコンパイルした拡張機能の Visual Studio SDK は、通常どおり、インストールした Visual Studio SDK で使用できます。

破壊的変更を参照しない場合でも、Visual Studio 2022 SDK および AMD64 専用に拡張機能をコンパイルする "必要があります"。

実行されるコードを含む拡張機能

実行されるコードを含む拡張機能は、Visual Studio 2022 専用にコンパイルする "必要があります"。 Visual Studio 2022 では、以前のバージョンの Visual Studio を対象とする拡張機能は読み込まれません。

以前の Visual Studio のバージョンの拡張機能を Visual Studio 2022 に移行する方法について説明します。

  1. プロジェクトを最新化します
  2. Visual Studio 2022 およびそれ以前のバージョンをターゲットにできるように、ソース コードを共有プロジェクトにリファクタリングします。
  3. Visual Studio 2022 をターゲットにした VSIX プロジェクトと、パッケージまたはアセンブリの再マッピング テーブルを追加します。
  4. 必要なコード調整を行います
  5. Visual Studio 2022 拡張機能をテストします
  6. Visual Studio 2022 拡張機能を公開します

実行されるコードを含まない拡張機能

実行されるコード (プロジェクトまたは項目テンプレートなど) を含まない拡張機能は、2 つの異なる VSIX の生成を含め、上記の手順に従う必要は "ありません"。

代わりに、1 つの VSIX を変更して、次のように 2 つのインストール ターゲットを source.extension.vsixmanifest ファイルで宣言します。

<Installation>
   <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[15.0,17.0)">
      <ProductArchitecture>x86</ProductArchitecture>
   </InstallationTarget>
   <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
      <ProductArchitecture>amd64</ProductArchitecture>
   </InstallationTarget>
</Installation>

この記事にある共有プロジェクトと複数の VSIX の使用についての手順は省略できます。 テストを続行できます。

Note

Visual Studio 2022 を使用して "新しい" Visual Studio 拡張機能を作成し、(同時に) Visual Studio 2019 またはそれ以前のバージョンもターゲットとする場合は、こちらのガイドを参照してください。

MSBuild タスク

MSBuild タスクを作成する場合は、Visual Studio 2022 では、64 ビットの MSBuild.exe プロセスに読み込まれる可能性があることに注意してください。 タスクの実行に 32 ビット プロセスが必要な場合は、「ターゲットとタスクを構成する」を参照して、MSBuild が 32 ビット プロセスでタスクを読み込むようにしてください。

VSIX プロジェクトを最新化する

拡張機能に Visual Studio 2022 のサポートを追加する前に、既存のプロジェクトにクリーンアップと最新化を行うことを強くお勧めします。

  1. packages.config から PackageReference に移行します

  2. Visual Studio SDK アセンブリへの直接の参照をすべて PackageReference 項目に置き換えます。

    -<Reference Include="Microsoft.VisualStudio.OLE.Interop" />
    +<PackageReference Include="Microsoft.VisualStudio.OLE.Interop" Version="..." />
    

    ヒント

    "複数" のアセンブリ参照を、メタパッケージへの "1 個" の PackageReference インスタンスだけで置き換えることができます。

    -<Reference Include="Microsoft.VisualStudio.OLE.Interop" />
    -<Reference Include="Microsoft.VisualStudio.Interop" />
    -<Reference Include="Microsoft.VisualStudio.Interop.8.0" />
    +<PackageReference Include="Microsoft.VisualStudio.Sdk" Version="..." />
    

    必ず、ターゲットとする Visual Studio の最小バージョンと一致するパッケージのバージョンを選択します。

Visual Studio SDK に固有でない一部のアセンブリ (たとえば Newtonsoft.Json.dll) は、Visual Studio 2022 以前は、単純な <Reference Include="Newtonsoft.Json" /> 参照を通じて検出可能であった可能性があります。 しかし、Visual Studio 2022 では、代わりにパッケージ参照が必要です。 その理由は、一部の Visual Studio ランタイムと SDK のディレクトリが、MSBuild の既定のアセンブリ検索パスから削除されたからです。

直接アセンブリ参照から NuGet パッケージ参照に切り替える際に、NuGet で依存関係の推移閉包が自動的にインストールされるため、追加のアセンブリ参照とアナライザー パッケージをピックアップすることがあります。 これは通常は問題ありませんが、ビルド中に追加の警告が出る可能性があります。 これらの警告については、できるだけ対処し解決します。 コード内の #pragma warning disable <id> リージョンを使用して、解決できない警告を抑制することを検討してください。

マルチターゲット用に共有プロジェクトを使用する

共有プロジェクトは、Visual Studio 2015 で導入されたプロジェクトの種類です。 Visual Studio の共有プロジェクトを使用すると、ソース コード ファイルを複数のプロジェクト間で共有し、条件付きコンパイル シンボルと一意の参照セットを使用して、異なる方法でビルドできます。

Visual Studio 2022 では、以前のすべての Visual Studio バージョンからの参照アセンブリの個別のセットが必要です。 そのため、共有プロジェクトを使用して、Visual Studio 2022、以前のバージョン、以降のバージョンに対して拡張機能を簡単にマルチターゲット化することをお勧めします。 この手法を使用すると、コードを共有しながら参照は個別にできます。

Visual Studio 拡張機能のコンテキストでは、Visual Studio 2022 以降用に 1 つの VSIX プロジェクトと、Visual Studio 2019 以前用に 1 つの VSIX プロジェクトを使用できます。 これらの各プロジェクトには、source.extension.vsixmanifest のインスタンスと、16.x SDK または 17.x SDK へのパッケージ参照が含まれています。 また、これらの VSIX プロジェクトには、2 つの Visual Studio バージョン間で共有できるすべてのソース コードをホストする新しい共有プロジェクトへの共有プロジェクト参照も含まれています。

このセクションでは、Visual Studio 2019 をターゲットとする VSIX プロジェクトが既に存在し、拡張機能を Visual Studio 2022 で機能させると想定しています。

これらの手順はすべて Visual Studio 2019 を使用して実行できます。

  1. まだ行ってない場合は、プロジェクトを最新化してください。この更新プロセスの後の手順が容易になります。

  2. Visual Studio SDK を参照する既存のプロジェクトごとに、ソリューションに新しい共有プロジェクトを追加します。 ソリューションを右クリックしてから、[追加]>[新しいプロジェクト] の順に選択します。

    Screenshot that shows the selections for adding a new project.

  3. [新しいプロジェクトの追加] ダイアログで、[共有プロジェクト]を検索し、[共有プロジェクト] テンプレートを選択します。

    Screenshot that shows searching for and selecting the Shared Project template.

  4. 各 Visual Studio SDK 参照プロジェクトから、対応する共有プロジェクトへの参照を追加します。

    Screenshot that shows selections for adding a shared project reference.

  5. 各 Visual Studio SDK 参照プロジェクトから対応する共有プロジェクトにすべてのソース コード (.cs ファイルと .resx ファイルを含む) を移動します。 source.extension.vsixmanifest ファイルは VSIX プロジェクトに残します。

    Screenshot that shows a shared project containing all source files.

  6. メタデータ ファイル (リリース ノート、ライセンス、アイコンなど) と VSCT ファイルを共有ディレクトリに移動します。 次に、それらをリンク ファイルとして VSIX プロジェクトに追加します。 共有ディレクトリは共有プロジェクトとは別のものであることに注意してください。

    Screenshot that shows selections for adding metadata and V S C T files as linked files.

    • メタデータ ファイルについては、[ビルド アクション][コンテンツ] に設定します。 [VSIX に含める]True に設定します。

      Screenshot that shows including metadata files in V S I X.

    • VSCT ファイルについては、[ビルド アクション][VSCTCompile] に設定します。 [VSIX に含める]False に設定します。

      Screenshot that shows selected properties for a V S C T file.

      この設定がサポートされていないと Visual Studio に表示される場合は、プロジェクトをアンロードして ContentVSCTCompile に変更することによって、ビルド アクションを変更できます。

      -<Content Include="..\SharedFiles\VSIXProject1Package.vsct">
      -  <Link>VSIXProject1Package.vsct</Link>
      -</Content>
      +<VSCTCompile Include="..\SharedFiles\VSIXProject1Package.vsct">
      +  <Link>VSIXProject1Package.vsct</Link>
      +  <ResourceName>Menus.ctmenu</ResourceName>
      +</VSCTCompile>
      
  7. プロジェクトをビルドして、エラーが発生していないことを確認します。

これで、プロジェクトに Visual Studio 2022 のサポートを追加する準備ができました。

Visual Studio 2022 のターゲットを追加する

このセクションは、共有プロジェクトを使用して Visual Studio 拡張機能を組み込む手順を完了していることを前提としています。

次の手順を使用して、Visual Studio 2022 サポートを拡張機能に追加します。 この手順は Visual Studio 2019 を使用して完了できます。

  1. ソリューションに新しい VSIX プロジェクトを追加します。 このプロジェクトは Visual Studio 2022 をターゲットとします。 テンプレートにあらかじめ含まれているソース コードは削除しますが、source.extension.vsixmanifest ファイルは残しておきます。

  2. 新しい VSIX プロジェクトで、Visual Studio 2019 をターゲットとする VSIX で参照しているのと同じ共有プロジェクトへの参照を追加します。

    Screenshot that shows a solution with one shared project and two V S I X projects.

  3. 新しい VSIX プロジェクトが正しくビルドされることを確認します。 コンパイラ エラーを解決するために、元の VSIX プロジェクトと一致する参照を追加することが必要になる場合があります。

  4. マネージド Visual Studio 拡張機能の場合は、Visual Studio 2022 をターゲットとするプロジェクト ファイル内のパッケージ参照を 16.x (またはそれ以前) から 17.x パッケージ バージョンに更新します。 NuGet パッケージ マネージャーを使用するか、プロジェクト ファイルを直接編集します。

    -<PackageReference Include="Microsoft.VisualStudio.SDK" Version="16.0.206" />
    +<PackageReference Include="Microsoft.VisualStudio.SDK" Version="17.0" />
    -<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="16.10.32" />
    +<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="17.0" />
    

    上記のコードに示されているバージョンは、デモンストレーションのみを目的としています。 実際のコードでは、NuGet Web サイトから入手できるバージョンを使用します。

    多くの場合、パッケージ ID は変更されています。 Visual Studio 2022 での変更点の一覧については、パッケージまたはアセンブリのマッピング テーブルを参照してください。

    C++ で記述された拡張機能には、コンパイルに使用できる SDK がまだありません。

  5. C++ プロジェクトの場合は、拡張機能は AMD64 用にコンパイルする必要があります。 マネージド拡張機能については、プロジェクトを Any CPU 向けのビルドから x64 をターゲットとするよう変更することを検討してください。 この変更により、Visual Studio 2022 では、拡張機能は常に 64 ビット プロセスで確実に読み込まれます。 Any CPU でも問題はありませんが、x64 専用のネイティブ バイナリを参照すると警告が生成される場合があります。

    拡張機能にネイティブ モジュールに対する依存関係がある可能性がある場合、それを x86 イメージから AMD64 イメージに更新する必要があります。

  6. source.extension.vsixmanifest ファイルを編集して Visual Studio 2022 をターゲットとするターゲットとするよう反映させます。 Visual Studio 2022 を示す <InstallationTarget> タグを設定します。 AMD64 ペイロードを示す ProductArchitecture 要素を設定します。

    <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
       <ProductArchitecture>amd64</ProductArchitecture>
    </InstallationTarget>
    

    重要

    Visual Studio 2019 では、このファイルのデザイナーは新しい ProductArchitecture 要素を表面に出しません。 この変更を行うには、XML エディターを使用する必要があります。 XML エディターにアクセスするには、ソリューション エクスプローラーに移動し、[ファイルを開くアプリケーションの選択] コマンドを選択します。

    ProductArchitecture 要素は重要です。 それがないと、拡張機能が Visual Studio 2022 にインストールされません。

    要素 説明
    ProductArchitecture x86, amd64 この VSIX でサポートされるプラットフォーム。 大文字と小文字は区別されません。 要素ごとに 1 つのプラットフォーム、InstallationTarget インスタンスごとに 1 つの要素を使用します。 製品バージョンが 17.0 未満の場合、既定値は x86 であり、省略できます。 製品バージョン 17.0 以降の場合、この要素は必須であり、既定値はありません。 Visual Studio 2022 の場合、この要素の有効なコンテンツは amd64 のみです。
  7. source.extension.vsixmanifest で、Visual Studio 2019 をターゲットとするものに一致するように、必要なその他の調整 (ある場合) を行います。

    それぞれに異なるバージョンの Visual Studio を対象とする拡張機能の 2 つのバージョンを公開する場合は、マニフェストの Identity 要素内の VSIX の ID が拡張機能ごとに異なっていることを確認してください。

この時点で、Visual Studio 2022 をターゲットにした拡張機能の VSIX ができます。 Visual Studio 2022 をターゲットにした VSIX プロジェクトをビルドし、表示されるビルドの中断を処理する必要があります。 Visual Studio 2022 をターゲットにした VSIX プロジェクトでビルドの中断がなければ、問題なしということです。 テストの準備ができています。

API の破壊的変更を処理する

API の破壊的変更には、以前のバージョンの Visual Studio で実行されていたコードの更新が必要になる場合があります。 コードを更新する方法のヒントについては、「Visual Studio 2022 の API の破壊的変更」を参照してください。

コードを調整する際には、「条件付きコンパイル」を使用することをお勧めします。 そうすることで、コードでは、Visual Studio 2022 のサポートを追加しながら、以前の Visual Studio バージョンを引き続きサポートできます。

Visual Studio 2022 をターゲットにした拡張機能をビルドしたら、テストに進みます。

条件付きコンパイル シンボルを使用する

Visual Studio 2022 と以前のバージョンに同じソース コードを使用する場合は、同じファイルであっても、条件付きコンパイルを使用することが必要な場合があります。 その後、コードをフォークして、破壊的変更に適応できます。 条件付きコンパイルは、C# 言語、Visual Basic 言語、C++ 言語の機能です。 これを使用することで、ほとんどのコードを共有しつつ、特定の箇所では別の API に対応することができます。

プリプロセッサ ディレクティブと条件付きコンパイル シンボルの使用方法の詳細については、「C# プリプロセッサ ディレクティブ」を参照してください。

以前の Visual Studio バージョンをターゲットとするプロジェクトでは、条件付きコンパイル シンボルが必要です。 このシンボルを使用して、さまざまな API を使用するようにコードをフォークできます。 プロジェクトのプロパティ ページで条件付きコンパイル シンボルを設定できます。

Screenshot that shows the box for entering a conditional compilation symbol.

必ず [すべての構成] についてコンパイル シンボルを設定してください。 既定では、入力するシンボルは 1 つの構成にのみ適用される場合があります。

C# の手法

次のコードに示すように、コンパイル シンボルをプリプロセッサ ディレクティブ (#if) として使用できます。 その後、コードをフォークして、異なる Visual Studio バージョン間で破壊的変更を処理するようにできます。

    Guid myGuid = new Guid("{633FBA02-719B-40E7-96BF-0899767CD104}");
    uint myFlags = 0;
    IVsShell shell = await AsyncServiceProvider.GlobalProvider.GetServiceAsync<SVsShell, IVsShell>();
#if Dev16
    shell.LoadUILibrary(myGuid, myFlags, out uint ptrLib);
#else
    shell.LoadUILibrary(myGuid, myFlags, out IntPtr ptrLib);
#endif

場合によっては、var を使用することで、型に名前を付けることを避けて、#if 領域の必要性を回避できます。 上記のスニペットは、次のように記述することもできます。

    Guid myGuid = new Guid("{633FBA02-719B-40E7-96BF-0899767CD104}");
    uint myFlags = 0;
    IVsShell shell = await AsyncServiceProvider.GlobalProvider.GetServiceAsync<SVsShell, IVsShell>();
    shell.LoadUILibrary(myGuid, myFlags, out var ptrLib);

#if 構文を使用している場合は、言語サービス コンテキストのドロップダウン リストを使用して構文の強調表示を変更する方法に注意してください。 もう 1 つのドロップダウン リストは、言語サービスが、この拡張機能のターゲット Visual Studio バージョンと別のバージョンに注目するのに役立ちます。

Screenshot that shows conditional compilation in a shared project.

XAML での共有の手法

XAML には、プリプロセッサ シンボルに基づいてコンテンツをカスタマイズできるプリプロセッサはありません。 Visual Studio 2022 と以前のバージョンとで内容が異なる 2 つの XAML ページをコピーして維持することが必要になる場合があります。

場合によっては、Visual Studio 2022 か以前のバージョンかに関わらず、個別のアセンブリに存在する型への参照は、1 つの XAML ファイルで引き続き表現できる場合があります。 アセンブリを参照している名前空間を削除します。

-xmlns:vsui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.14.0"
-Value="{DynamicResource {x:Static vsui:TreeViewColors.SelectedItemActiveBrushKey}}"
+Value="{DynamicResource TreeViewColors.SelectedItemActiveBrushKey}"

拡張機能をテストする

Visual Studio 2022 をターゲットとする拡張機能をテストするには、Visual Studio 2022 がインストールされている必要があります。 以前のバージョンの Visual Studio で 64 ビットの拡張機能を実行することはできません。

拡張機能のターゲットが Visual Studio 2022 でも以前のバージョンでも、Visual Studio 2022 を使用してそのビルドとテストを行うことができます。 Visual Studio 2022 から VSIX プロジェクトを開くと、Visual Studio の実験インスタンスが開きます。

拡張機能でサポートする予定の各 Visual Studio バージョンについてテストすることを強くお勧めします。

拡張機能の公開

ターゲットである Visual Studio 2022 を拡張機能に追加してテストしました。 これで、世界から賞賛される拡張機能を公開する準備ができました。

Visual Studio Marketplace

拡張機能を Visual Studio Marketplace に公開することは、新しいユーザーに拡張機能を見つけてインストールしてもらう優れた方法です。 拡張機能のターゲットが Visual Studio 2022 だけか、以前の Visual Studio バージョンもターゲットとするかにかかわらず、Marketplace でサポートされます。

将来的には、Marketplace で、単一の Marketplace リスティングに複数の VSIX をアップロードできるようになります。 そうなれば、Visual Studio 2022 ターゲットの VSIX と、以前のバージョンの Visual Studio 向けの VSIX をアップロードできます。 ユーザーは、Visual Studio 拡張機能マネージャーを使用していれば、インストールした Visual Studio バージョンに適した VSIX を自動的に取得します。

カスタム インストーラー

拡張機能をインストールするための MSI ファイルまたは EXE ファイルをビルドする場合、および拡張機能 (の一部分) をインストールするための vsixinstaller.exe を生成する場合は、Visual Studio 2022 の VSIX インストーラーが更新されたことに注意してください。 開発者は、そのバージョンの Visual Studio に拡張機能をインストールするために、Visual Studio 2022 に付属している当該バージョンの VSIX インストーラーを使用する必要があります。

Visual Studio 2022 の VSIX インストーラーによって、同じコンピューター上に Visual Studio 2022 と共に存在している、以前のバージョンの Visual Studio をターゲットとする適用可能な拡張機能もインストールされます。

ネットワーク共有

LAN または他の方法で拡張機能を共有できます。 Visual Studio 2022 と以前のバージョンを共に対象とする場合は、複数の VSIX を個別に共有する必要があります。 インストールした Visual Studio のバージョンに基づいてどの VSIX をインストールするか、わかりやすいファイル名を付けます (または、一意のフォルダーに配置します)。

依存関係

ご自身の VSIX で <dependency> 要素を使用して別の VSIX を依存関係として指定する場合、参照した各 VSIX は、ご自身の VSIX と同じターゲットおよび製品アーキテクチャにインストールされる必要があります。 依存する VSIX がターゲットの Visual Studio のインストールをサポートしていない場合、ご自身の VSIX は正しく実行されません。

依存する VSIX で、ご自身のものより多くのターゲットとアーキテクチャがサポートされていることは問題ありません (少ないのは不可)。 この制限は、依存関係をもつ VSIX の配置と配布のアプローチが、依存関係の配置と配布のアプローチを反映している必要があることを意味します。

Q & A

Q: 拡張機能はデータ (テンプレートなど) を提供するだけなので、相互運用性に関するは必要ありません。 Visual Studio 2022 も含む単一の拡張機能を作成できますか。

A: はい。 この件については、「実行されるコードを含まない拡張機能」を参照してください。

Q: NuGet の依存関係によって古い相互運用機能アセンブリが持ち込まれ、クラスのクラッシュを引き起こしています。 どうすればよいですか。

A: .csproj ファイルに次の行を追加して、アセンブリが重複しないようにします。

    <PackageReference Include="<Name of offending assembly>" ExcludeAssets="compile" PrivateAssets="all" />

このコードにより、パッケージ参照によって他の依存関係から古いバージョンのアセンブリがインポートされなくなります。

Q: ソース ファイルを共有プロジェクトに切り替えた後、Visual Studio でコマンドとホットキーが機能しなくなりました。 どうすればよいですか。

A: イメージ オプティマイザー サンプルのステップ 2.4 に、VSCT ファイルをリンク項目として追加し、VSCT ファイルにコンパイルする方法が示されています。

ステップごとのプロジェクトとコード変更へのリンクが記載された、ImageOptimizer の操作手順の例に従ってください。