忍者ブログ

[PR]

2024年10月19日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

「Platform Compatibility Analyzer」ってなに?

2017年11月10日





 Platform Compatibility Analyzerは、クロスプラットフォームでの互換性に問題がある.NET APIや使用が推奨されていない.NET APIを見つけてくれるツール。本稿執筆時点(2017年11月6日)ではαバージョンであり、NuGetパッケージとして提供されている。

.NET Portability Analyzerによる解析結果をHTMLとして表示したもの

 .NET Frameworkは誕生から既に10年を超えるフレームワークであり、より高度な機能を持つAPIが誕生すると、それらのAPIで古いAPIが置き換えられるという歴史を繰り返してきた(例えば、HttpClientクラスはWebClientクラスとHttpWebRequestクラスを置き換えるものだし、ArrayListクラスとListクラスでは後者を使うべきだ)。その一方で、互換性維持のために古いAPIも残されている。そうなると、どれを使うべきか、どれを使うべきでないかの判断は難しい。また、.NET Coreの広まりとともに、クロスプラットフォームで利用できるAPIとそうではないAPIも登場している。古いAPIを使わないようにしたり、さまざまなプラットフォームで使えるAPIだけを使用したりするようにするには、開発者が個々のAPIの素性を覚えるよりも、使えるAPI、使うべきでないAPIを機械任せで簡単に判断できることが重要だ。

○Platform Compatibility Analyzerのインストールと利用

 Platform Compatibility Analyzerパッケージは.NET Coreプロジェクトや.NET Standardベースのクラスライブラリプロジェクトにインストールする形で利用する。一番簡単なのは、Visual Studio(以下、VS)のソリューションエクスプローラーでソリューションやプロジェクトを右クリックして、コンテキストメニューから[ソリューションの NuGet パッケージの管理](ソリューションを右クリックした場合)あるいは[NuGet パッケージの管理](プロジェクトを右クリックした場合)を選択することだ。これにより、NuGetパッケージの管理ウィンドウが表示されるので、[参照]タブを開いて[検索]ボックスに「Analyzers.Compatibility」などと入力をする。Microsoft.Dotnet.Analyzers.Compatibilityパッケージが表示されたら、これを選択して[インストール]ボタンをクリックするだけだ。

 インストール後は、VS 2017でコードを入力していくと、問題のあるAPIについてはその場で警告が発せられるようになる。現在のところは、次のようなものが警告を発する対象となっている。

・全てのプラットフォームではサポートされていないAPI(PlatformNotSupportedExceptionを発生するAPI)
・.NET Standardにはあるが、.NET Framework 4.6.1ではサポートされていないAPI
・UWPでは使用できないネイティブAPI
・deprecatedなAPI

 詳細な分類については、Platform Compatibility Analyzerのドキュメントにある各種の.mdファイルを参照されたい。例えば、「全てのプラットフォームではサポートされていないAPI」はPC001というカテゴリーに分類され、PC001.mdファイルにそのドキュメントがまとめられている。

 ソリューションエクスプローラーの[依存関係]-[アナライザー]-[Microsoft.Dotnet.Analyzers.Compatibility]以下にもこのNuGetパッケージで定義されている規則が一覧表示される。ただし、具体的にどのAPIが使用できないか(使用すべきでないか)までは表示されないので、各項目を右クリックしてコンテキストメニューから[ヘルプの表示]を選択する必要がある。これにより、上述したドキュメント(.mdファイル)がブラウザで開かれる。

 例えば、ConsoleクラスのTitleプロパティ(コンソールウィンドウのタイトル)はmacOSやLinuxではサポートされていない。このプロパティを使用したコードを記述すると、次のように警告が表示される。このときには、同時に[エラー一覧]ウィンドウにも、警告が表示される。

 このように、コードを記述していくと、.NET Core/.NET Standardプロジェクトで使えないAPIや使うべきではないAPIが即座に分かるのが、このツールの良いところだ(ただし、後述する.NET Portability Analyzerが有効だと、ビルドを行わないと警告が表示されない場合があるビルドを行うまでは警告が表示されなくなることがある )。

 なお、警告を表示したくないものについては、ソリューションエクスプローラーで該当する項目を右クリックして、コンテキストメニューから[ルールセットの重要度の変更]から[非表示]や[なし]を選択する。もちろん、重要度を[エラー]に設定すれば、おなじみの赤い波線でエラーがあると報告されるようになる。

 該当するコードを右クリックして、コンテキストメニューから[クイック アクションとリファクタリング]を選択して、警告の表示を抑制することもできる(プロジェクトファイルを直接編集する方法もあるが、これについては以下で紹介する参考資料を参照からたどってほしい)。

 移植性を確認するためのツールとしては、.NET Portability Analyzerもある。こちらは、VSの拡張機能として利用するもので、ソリューションエクスプローラーでソリューションあるいはプロジェクトを右クリックして、コンテキストメニューから[Analyze Assembly Portability](ソリューションを右クリックした場合)や[Analyze Project Portability](プロジェクトを右クリックした場合)を選択することで、移植性の確認を行える。以下は先ほど見たConsole.Titleプロパティを表示するコードを解析した結果だ。

 どちらを使うのがよいかについては「好みによる」ということになるだろう。ただし上の例を見ると、Platform Compatibility AnalyzerではPlatformNotSupportedExceptionを発生するAPI(Console.Titleプロパティはその例)を発見してくれたが、.NET Portability Analyzerでは発見できなかった(APIとしては用意されていて、例外が発生するということだ)。両者のこれからの発展次第ではあるが、移植性がないコードの判断にはツールごとに差異があるので、使う際には注意が必要だろう。

 Platform Compatibility Analyzerを使用すると、コードの記述と同時にその場その場で、クロスプラットフォームでの互換性に問題がある.NET APIや使用が推奨されていない.NET APIを見つけてくれる。.NET Frameworkが提供するAPIはより高度な機能を持つAPIで古いものが置き換えられているが、互換性維持のためには古いAPIも残されている。そうしたAPIを使わないようにしたり、さまざまなプラットフォームで使えるAPIだけを使用したりするようにするために、こうしたツールを使うのが効率的といえるだろう。