重要
この記事のアドバイスは、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 バージョン) メタパッケージは、必要な参照アセンブリの大部分またはすべてを取り込みます。
- Visual Studio 2022 準拠の VSIX をビルドできるように、Microsoft.VSSDK.BuildTools (17.x バージョン) パッケージを 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 に移行する方法について説明します。
- プロジェクトを最新化します。
- Visual Studio 2022 以前のバージョンをターゲットにできるように、ソース コードを共有プロジェクト にリファクタリングします。
- Visual Studio 2022 を対象とする VSIX プロジェクト と、パッケージ/アセンブリの再マップ テーブル追加します。
- 必要なコード調整をします。
- Visual Studio 2022 拡張機能のをテストします。
- Visual Studio 2022 拡張機能を発行します。
コードを実行しない拡張機能
実行コードを含まない拡張機能 (プロジェクト テンプレートや項目テンプレートなど) については、2 つの異なる VSIX の生成を含め、上記の手順に従う必要は "ありません"。
代わりに、1 つの VSIX を変更して、source.extension.vsixmanifest
ファイルで次の 2 つのインストール ターゲットが宣言されるようにします。
<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 の使用に関するこの記事の手順は省略できます。 テストに進むことができます。
手記
Visual Studio 2022 を使用して Visual Studio 拡張機能 新しい を作成していて、Visual Studio 2019 以前のバージョンも対象にする場合は、このガイド を参照してください。
MSBuild タスク
MSBuild タスクを作成する場合は、Visual Studio 2022 では、64 ビットの MSBuild.exe プロセスに読み込まれる可能性があることに注意してください。 タスクの実行に 32 ビット プロセスが必要な場合は、「ターゲットとタスク を構成して、MSBuild が 32 ビット プロセスでタスクを読み込むかどうかを確認する」を参照してください。
VSIX プロジェクトを最新化する
Visual Studio 2022 のサポートを拡張機能に追加する前に、既存のプロジェクトをクリーンアップして最新化することを強くお勧めします。
直接の 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 を使用して実行できます。
まだ行ってない場合は、この更新プロセスの後の手順が簡単になるように、プロジェクトを最新化してください。
Visual Studio SDK を参照する既存のプロジェクトごとに、ソリューションに新しい共有プロジェクトを追加します。 ソリューションを右クリックし、[追加>新しいプロジェクト] を選択します。
[新しいプロジェクト の追加] ダイアログで、共有プロジェクト 検索し、共有プロジェクト テンプレートを選択します。
各 Visual Studio SDK 参照プロジェクトの参照を、対応する共有プロジェクトに追加します。
すべてのソース コード (.cs および .resx ファイル を含む) を各 Visual Studio SDK 参照プロジェクトから、対応する共有プロジェクトに移動します。 source.extension.vsixmanifest ファイルは VSIX プロジェクトのままにします。
メタデータ ファイル (リリース ノート、ライセンス、アイコンなど) と VSCT ファイルを共有ディレクトリに移動します。 次に、リンク ファイルとして VSIX プロジェクトに追加します。 共有ディレクトリは共有プロジェクトとは別であることに注意してください。
メタデータ ファイルの場合、ビルド アクション コンテンツ をに設定します。 を VSIX に含めるよう を Trueに設定します。
VSCT ファイルの場合は、ビルド アクション VSCTCompile をに設定します。 [Include in VSIX] (VSIX に含める) を False に設定します。
Visual Studio でこの設定がサポートされていないという苦情が表示された場合は、プロジェクトをアンロードし、
Content
をVSCTCompile
に変更することで、ビルド アクションを手動で変更できます。-<Content Include="..\SharedFiles\VSIXProject1Package.vsct"> - <Link>VSIXProject1Package.vsct</Link> -</Content> +<VSCTCompile Include="..\SharedFiles\VSIXProject1Package.vsct"> + <Link>VSIXProject1Package.vsct</Link> + <ResourceName>Menus.ctmenu</ResourceName> +</VSCTCompile>
プロジェクトをビルドして、エラーが発生していないことを確認します。
これで、プロジェクトで Visual Studio 2022 のサポートを追加する準備ができました。
Visual Studio 2022 ターゲットを追加する
このセクションでは、共有プロジェクト を使用して Visual Studio 拡張機能をする手順を完了していることを前提としています。
次の手順を使用して、Visual Studio 2022 のサポートを拡張機能に追加します。 Visual Studio 2019 を使用して完了できます。
ソリューションに新しい VSIX プロジェクトを追加します。 このプロジェクトは、Visual Studio 2022 を対象とします。 テンプレートに付属するすべてのソース コードを削除しますが、source.extension.vsixmanifest ファイル 保持します。
新しい VSIX プロジェクトで、Visual Studio 2019 をターゲットとする VSIX が参照するのと同じ共有プロジェクトへの参照を追加します。
新しい VSIX プロジェクトが正しくビルドされていることを確認します。 コンパイラ エラーを解決するには、元の VSIX プロジェクトに一致する参照を追加する必要がある場合があります。
マネージド Visual Studio 拡張機能の場合は、パッケージ参照を 16.x (またはそれ以前) から Visual Studio 2022 ターゲット プロジェクト ファイルの 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 がまだありません。
C++ プロジェクトの場合、拡張機能は AMD64 用にコンパイルする必要があります。 マネージド拡張機能の場合は、プロジェクトを Any CPU のビルドから x64 ターゲットに変更することを検討してください。 この変更により、Visual Studio 2022 では、拡張機能が常に 64 ビット プロセスで読み込まれます。 CPU も問題ありませんが、x64 専用のネイティブ バイナリを参照すると警告が生成される可能性があります。
拡張機能がネイティブ モジュールに対して持つ可能性がある依存関係は、x86 イメージから AMD64 イメージに更新する必要があります。
source.extension.vsixmanifest ファイルを編集して、Visual Studio 2022 を対象とするようにします。
<InstallationTarget>
タグを Visual Studio 2022 を示すように設定します。 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
のみです。visual Studio 2019 を対象とするもの (存在する場合) と一致するように、source.extension.vsixmanifest で必要なその他の調整を行います。
それぞれ異なるバージョンの 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 を使用できます。 条件付きコンパイル シンボルは、プロジェクトのプロパティ ページで設定できます。
すべての構成のコンパイル シンボルを必ず設定してください。 既定では、入力したシンボルは 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 つのドロップダウン リストは、言語サービスが、この拡張機能の 1 つのターゲット Visual Studio バージョンと別のバージョンに注目するのに役立ちます。
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 では、複数の VSIX を 1 つの Marketplace 登録情報のみにアップロードできるようになります。 その後、Visual Studio 2022 を対象とする VSIX と、以前のバージョンの Visual Studio 用の VSIX をアップロードできます。 ユーザーは、Visual Studio 拡張機能マネージャーを使用しているときに、インストールした Visual Studio バージョンに適した VSIX を自動的に取得します。
カスタム インストーラー
MSI または EXE ファイルをビルドして拡張機能をインストールし、その一部をインストールするために vsixinstaller.exe
を起動する場合は、Visual Studio 2022 の VSIX インストーラーが更新されていることに留意してください。 開発者は、Visual Studio 2022 に付属する VSIX インストーラーのバージョンを使用して、そのバージョンの Visual Studio に拡張機能をインストールする必要があります。
Visual Studio 2022 の VSIX インストーラーには、同じコンピューターに Visual Studio 2022 と共に存在する以前のバージョンの Visual Studio を対象とする適用可能な拡張機能もインストールされます。
ネットワーク共有
LAN またはその他の方法で拡張機能を共有できます。 Visual Studio 2022 以前のバージョンを対象とする場合は、複数の VSIX を個別に共有する必要があります。 インストールした Visual Studio のバージョンに基づいてインストールする VSIX をユーザーが把握するのに役立つファイル名 (または一意のフォルダーに配置) を指定します。
依存関係
VSIX で他の VSIX を <dependency>
要素経由の依存関係として指定する場合は、参照される各 VSIX を VSIX と同じターゲットと製品アーキテクチャにインストールする必要があります。 依存 VSIX で Visual Studio のターゲット インストールがサポートされていない場合、VSIX は失敗します。
依存する VSIX がサポートするターゲットとアーキテクチャは、お客様のものより多い場合は問題ありませんが、少ない場合はいけません。 この制限は、依存関係を持つ VSIX のデプロイと配布のアプローチが、その依存する VSIX の展開と分散のアプローチを反映する必要があることを意味します。
Q & A
Q: 拡張機能はデータ (テンプレートなど) を提供するため、相互運用性の変更は必要ありません。 Visual Studio 2022 も含まれる 1 つの拡張機能を作成できますか?
: はい! 詳細については、「コード を実行せずに拡張機能を する」を参照してください。
Q: NuGet の依存関係により、古い相互運用性アセンブリが導入され、クラスの競合が発生しています。 どうしたらいいでしょう。
A: .csproj ファイルに次の行を追加して、アセンブリの重複を回避してください。
<PackageReference Include="<Name of offending assembly>" ExcludeAssets="compile" PrivateAssets="all" />
このコードにより、パッケージ参照が他の依存関係から古いバージョンのアセンブリをインポートできなくなります。
Q: ソース ファイルを共有プロジェクトに切り替えた後、コマンドとホットキーが Visual Studio で動作しなくなりました。 どうしたらいいでしょう。
: イメージ オプティマイザー サンプルの手順 2.4 は、VSCT ファイルをリンク項目として追加し、それらを VSCT ファイルにコンパイルする方法を示します。
関連コンテンツ
段階的な例を参照してください。ImageOptimizer プロジェクトと各ステップのコード変更へのリンクが含まれています。