検索
連載

Platform Compatibility AnalyzerDev Basics/Keyword

Platform Compatibility Analyzerを使用すると、クロスプラットフォームでの互換性に問題がある.NET APIなどをその場その場で見つけてくれる。

Share
Tweet
LINE
Hatena
「Dev Basics/Keyword」のインデックス

連載目次

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

 .NET Frameworkは誕生から既に10年を超えるフレームワークであり、より高度な機能を持つAPIが誕生すると、それらのAPIで古いAPIが置き換えられるという歴史を繰り返してきた(例えば、HttpClientクラスはWebClientクラスとHttpWebRequestクラスを置き換えるものだし、ArrayListクラスとList<T>クラスでは後者を使うべきだ)。その一方で、互換性維持のために古い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パッケージが表示されたら、これを選択して[インストール]ボタンをクリックするだけだ。

Platform Compatibility Analyzerパッケージのインストール
Platform Compatibility Analyzerパッケージのインストール

 インストール後は、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ファイル)がブラウザで開かれる。

Platform Compatibility Analyzerパッケージで定められている規則
Platform Compatibility Analyzerパッケージで定められている規則

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

Console.TitleプロパティはmacOSとLinuxではサポートされない(赤枠内)
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プロパティを表示するコードを解析した結果だ。

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

 どちらを使うのがよいかについては「好みによる」ということになるだろう。ただし上の例を見ると、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だけを使用したりするようにするために、こうしたツールを使うのが効率的といえるだろう。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る