Share via


Visual Studio 2022 での API の破壊的変更

Visual Studio 2022 に拡張機能を移行する場合、ここに一覧表示されている破壊的変更が影響する可能性があります。

参照アセンブリがインストールされなくなった

Visual Studio のインストール ディレクトリから解決された、その MSBuild を参照していた可能性のあるアセンブリの多くはインストールされなくなりました。 必要な Visual Studio SDK ref アセンブリを取得するには、NuGet を使用する必要があります。 これを行う詳細な手順については、プロジェクトの最新化に関するページを参照してください。

API の削除

Visual Studio 2022 では、今後の Visual Studio の移行の一環としていくつかの API が削除されています。 削除された API のリストは、削除された API のリストに関するページで確認できます。

相互運用性の破壊的変更

Visual Studio 2022 では多くの API が変更されています。通常はコードで簡単に対応できる単純な変更です。

破壊的変更を管理するために、相互運用機能アセンブリを配布するための新しいメカニズムを提供する予定です。 具体的には、Visual Studio 2022 以降では、多くの一般的なパブリック Visual Studio インターフェイスの定義を含む単一の相互運用機能アセンブリを提供します。 そのアセンブリには、複数の相互運用機能アセンブリから移行する多くの Visual Studio インターフェイスのマネージド定義が含まれています。 新しい相互運用機能アセンブリは、Microsoft.VisualStudio.Interop NuGet パッケージを使用して配布されます。

しかし、主にネイティブ コンテキストで使用され、破壊的変更の数が少ない Visual Studio コンポーネントには、引き続き独自の相互運用機能アセンブリが含まれることになります (たとえば、デバッガー アセンブリは引き続き、現在の場合と同じように VisualStudio.Debugger.Interop.dll となります)。 いずれにせよ、現在の場合と同じように、アセンブリをアプリケーションから参照することができます。

これは重大な変更であり、この新しいアプローチでビルドされた API とアセンブリを使用する拡張機能は、前の相互運用機能アセンブリを使用している古いバージョンの Visual Studio と互換性がないことを意味します。

これには、拡張機能を Visual Studio 2022 により簡単に更新できるようになる非常に重要な利点がいくつかあります。

  • 破損した API はビルド時エラーとなり、それらを見つけて修正しやすくなります。
  • Visual Studio 2022 では破損した API を使用するコードのみを更新する必要があります。
  • 古くなり、破損した API を誤って使用できなくなります。

全体として、これらの変更により、すべてのユーザーに対して Visual Studio がより安定したバージョンとなります。 このアプローチの大きな欠点は、ターゲットの Visual Studio バージョンごとに 1 回コードをコンパイルしないとマネージド アセンブリを Visual Studio 2019 と Visual Studio 2022 の両方で実行できないことです。

Visual Studio 2019 と Visual Studio 2022 の API の違いによるコンパイル エラーを確認しながら、その API または発生するパターンを参照できます。これらは、その修正方法についてのガイダンスとともに以下に一覧表示されています。

int または uint (IntPtr が想定されている場合)

これは非常に一般的なエラーであると考えられます。 Visual Studio 2022 を 64 ビット プロセスにするために、一部の相互運用 API を修正する必要がありました。これは、ポインターが 32 ビット整数に収まり、ポインターサイズの値を実際に使用できることを想定しています。

サンプル エラー:

引数 3: 'out uint' から 'out System.IntPtr' に変換できません

コードを更新し、破損を解決するために IntPtr または UIntPtr (以前は int または uint だった場合) を想定または指定するだけです。

修正のサンプル:

-shell.LoadLibrary(myGuid, myFlags, out uint ptrLib);
+shell.LoadLibrary(myGuid, myFlags, out IntPtr ptrLib);

相互運用機能型が 2 つのアセンブリで定義されている

使用している型が 2 つのアセンブリで定義されていることを示すエラーが C# コンパイラによって報告された場合は、参照しなくなったはずの SDK の Visual Studio 2019 バージョンのアセンブリを参照していることがあります。

サンプル エラー:

エラー CS0433: 型 'IVsDpiAware' が、'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' と 'Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' の両方に存在します

参照アセンブリの再マッピング テーブルに関するページを参照し、Visual Studio 2022 で優先名としてどのアセンブリ名が使用されているかを確認します。 上記のサンプル エラーに示されている 2 つのアセンブリを検討し、このテーブルを確認して、Microsoft.VisualStudio.Interop が新しいアセンブリ名であることに注目してください。 その後、プロジェクトから Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime への参照を削除して修正します。

場合によっては、型フォワーダーを含む非推奨のアセンブリに対して、Visual Studio 2022 でバージョン管理されたパッケージを提供します。 これが使用できる場合は、パッケージ参照を削除するのではなく、Visual Studio 2022 バージョンに ''アップグレード'' することもできます。 型フォワーダーによってコンパイラからエラーが解決されます。

これらの参照は、推移的なパッケージ参照によって得られる場合があるため、プロジェクト ファイルで行われる直接参照よりも削除が困難になる可能性があることに注意してください。 そのような場合は、すべての直接パッケージ参照で、Visual Studio 2022 SDK パッケージ自体が使用されていることを確認してください。 project.assets.js を参照して、非推奨のアセンブリに取り込むパッケージのチェーンを特定することができます。 推移的なパッケージ参照を Visual Studio 2022 バージョンに更新することは、直接参照としてインストールするのと同様に簡単です。

依存関係ツリーを変更できない場合 (たとえば、サードパーティの依存関係が含まれているため)、Visual Studio 2022 より前のパッケージへの直接パッケージ参照を追加し、その PackageReference 項目に ExcludeAssets="compile" メタデータを追加してコンパイラ エラーを解決することができます。 しかし、この方法では、拡張機能で Visual Studio 2022 より前のアセンブリに対する依存関係が保持され、実行時に拡張機能が誤動作する場合があることに注意してください。

相互運用機能アセンブリへの参照が欠落しています

Visual Studio 2022 より前の SDK に対してコンパイルされたアセンブリを参照すると、アセンブリ参照の欠落に関するエラーが発生することがあります。

サンプル エラー:

エラー CS0012 型 'IVsTextViewFilter' は、参照されていないアセンブリで定義されています。 アセンブリ 'Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' への参照を追加する必要があります

参照アセンブリの再マッピング テーブルを使用して、要求されたアセンブリが実際には参照する必要があるものではないことを確認できます。

最善の修正策は、Visual Studio 2022 SDK に対してコンパイルされたバージョンに依存関係を更新し、削除された相互運用機能アセンブリがコンパイラによって要求されなくなるようにすることです。

場合によっては、型フォワーダーを含む非推奨のアセンブリに対して、Visual Studio 2022 でバージョン管理されたパッケージを提供します。 これを使用できる場合は、古いパッケージの Visual Studio 2022 バージョンにパッケージ参照を追加して、型フォワーダーによってコンパイラからエラーが解決されるようにすることができます。

IAsyncServiceProvider が欠落しています

2 つの名前空間に、このインターフェイスの定義が 2 つあります。 これらのうちの 1 つだけが、管理対象の使用を目的としています。

Visual Studio 2019 の名前空間 Visual Studio 2022 の名前空間 使用目的
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider マネージド コードの使用
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider 下位相互運用のみ

IAsyncServiceProvider に関するエラーが表示される場合は、ネイティブ コード (2 番目の行) 用のものを使用していた ''可能性'' があります。 その場合は、新しい名前空間に更新するか、より管理しやすいインターフェイスに切り替えることができます。

DTE および _DTE 型キャストの失敗

DTE_DTE はどちらもインターフェイスです。 一方は他方から派生します。 しかし、Visual Studio 2022 では、基本型と派生型が入れ替わります。 これにより、特定の型の割り当てやキャストが失敗します。

これは、以前に new DTE() を使用していた場合、今後は new _DTE() を使用する必要があることも意味します。

これでほとんどの問題を軽減するには、代わりに EnvDTE80 名前空間の DTE2 を使用します。

メソッド呼び出しの引数が欠落しています

いくつかのメソッドでは、相互運用 API の省略可能なパラメーターとして既定の引数が宣言されなくなりました。 COM 相互運用呼び出しに対する引数の欠落に関するエラーが発生し、パラメーターで object 型を呼び出した場合、Visual Studio 2019 相互運用 API によって定義された以前の既定値が "" であった可能性があります。そのため、コンパイル エラーを解決するために引数として "" を追加することを検討してください。

既定の引数がどのように使用されているかがわからない場合は、言語サービス コンテキストを Visual Studio 2022 から Visual Studio 2019 に切り替えてみて、古い相互運用機能アセンブリを使用して Intellisense を取得し、既定の引数の内容を確認してから、コードに明示的に追加してください。 Visual Studio 2019 用にコンパイルされている場合は引き続き正常に動作しますが、Visual Studio 2022 に対してコンパイルされるようになります。

修正のサンプル:

-process4.Attach2();
+process4.Attach2("");

レガシ Find API の非推奨化

ファイル内の検索を最新化する取り組みの一環として、VS 2022 の EnvDTE インターフェイスの次の API のサポートが非推奨となりました。

これらの API は VS 2022 以降では機能しなくなります。 代わりに IFinder Interface (Microsoft.VisualStudio.Text.Operations) の使用をお勧めします。このインターフェイスには、find メソッドと replace メソッドがあります。 IFinder インターフェイスを実装するオブジェクトへのアクセスは、IFindService.CreateFinderFactory メソッド を使用して取得できます。 サードパーティの拡張機能の Visual Studio への移行で、古い API から最新の IFinder API に移行する例については、「EnvDTE Find and Replace パターン API から最新の IFinder API にコード メイド拡張機能を移行する」を参照してください。