.NET Portability Analyzerは、さまざまなプラットフォームをまたいだ.NETプログラムの移植性をチェックするためのツール。
.NET Portability Analyzerは、さまざまなプラットフォームをまたいだ.NETプログラムの移植性をチェックするためのツール。Visual Studio拡張機能/コマンドラインツールとして提供されている(本稿ではVisual Studio拡張機能としての利用法を見ていく。また、以降ではVisual StudioをVSと記述する)。
.NET Framework、.NET Core、Monoなど、さまざまなプラットフォームの上でさまざまな.NET実装が動作している。ただし、それぞれの.NET実装が提供しているAPIは異なる。特定の.NET実装でもそのバージョンが上がれば、以前のバージョンでは提供されていなかったAPIが提供されるだろうし、個々の.NET実装ごとに提供されるAPIは異なるものになるだろう。
そのため、あるプラットフォーム上で動作していた.NETコードが別のプラットフォームでは動作しないということが発生する。.NET Portability Analyzerはプラットフォーム間での移植性がないAPIを「ピンポイント」で検出してくれる。.NET Portability Analyzerは「自分が書いたコードをさまざまなプラットフォームで動作させるには、コードのどの部分を修正すればよいかを知る(あるいは問題なく動作することを確認する)」ためのツールといえる。
.NET Portability AnalyzerはVS Marketplaceで配布されているので、これをダウンロード/インストールする(VSが起動しているのであれば、インストール後にVSを再起動)。
インストールをしたら、移植性をチェックしたいプロジェクト(またはソリューション)をソリューションエクスプローラーで右クリックして、コンテキストメニューから[Analyze Assembly Portability]を選択するだけだ。
コンテキストメニューから[Portability Analyzer Settings]を選択すれば、設定を行える。
この画面では移植性のチェックを行う対象となる.NET実装のバージョン、出力形式を指定できる。上の画面では出力形式はHTMLとして、チェック対象のプラットフォームには.NET Core 1.0、.NET Framework 4.6などを指定していることが分かる。出力形式にはJSON、Excelも指定可能だ。
解析を実行すると、次のようなウィンドウが表示されるので、[Open Report]リンクをクリックする。すると、解析結果が(この場合はWebブラウザに)表示される。
画面下部にある赤い「×」はチェック対象としたプラットフォームではサポートされていないことを示している。上の画像ではSystem.InvalidProgramExceptionクラスが.NET Standard 1.2ではサポートされていないことが示されている。そして「このアセンブリを.NET Standard 1.2(以下をサポートする)環境で利用するには、ここを修正する必要がある」ことが一目で分かるというわけだ。
このように、.NET Portability Analyzerを使用することで、何らかの.NET環境上で動作するように作成したコード(多くの場合は、ライブラリやフレームワークなど、再利用されることを念頭に置いたもの)を他の.NET環境で動作させるのに、どんな変更が必要になるのか(必要ないのか)が簡単に判断できる。
ここでは例として次の3つのプロジェクトで構成されるソリューションを用意した。以降では、このソリューションを例として.NET Portability Analyzerの動作を見ていこう。
.NET Standardは、ここではそれぞれのプラットフォームが実装している(はずの)APIセットを規定するものであると考えてほしい。そして、あるバージョンの.NET Standardに準拠しているライブラリ(PCL)は、そのバージョンの.NET Standardをサポートするプラットフォームで問題なく利用できるということだ。ここでは、.NET Core 1.0、.NET Framework 4.6などでサポートされている.NET Standard 1.3準拠のPCLを作成している(ということは、上の2つのコンソールアプリからこのPCLを問題なく利用できるということだ)。
PCLを作成するMyLibプロジェクトでは次の2つの静的メソッドを公開している。サンプルなのでコード自体に意味はほぼないが、1つのメソッドは「XXX」という文字列を受け取って「Hello, XXX」という文字列を返すもので、もう1つのメソッドはInvalidProgramException例外を送出するだけのものだ。
public static class MyLib
{
public static string Hello(string s) => "Hello, " + s;
public static void RaiseInvalidProgramException()
{
throw new InvalidProgramException("exception from PCL");
}
}
残る2つのコンソールアプリプロジェクトのコードはほぼ同一なので、ここでは.NET Coreプロジェクトのコードのみを掲載する(名前空間名とHelloメソッド呼び出しの引数が異なるだけ)。強調書体で表示しているのがMyLibプロジェクトで公開されているメソッドの利用箇所だ。
using static MyLib.MyLib;
using static System.Console;
namespace ConsoleAppCore
{
public class Program
{
public static void Main(string[] args)
{
WriteLine(Hello(".NET Core"));
try
{
RaiseInvalidProgramException();
}
catch (InvalidProgramException e)
{
WriteLine(e.Message);
}
ReadKey();
}
}
}
プログラム自体の実行結果は次のようになる。
そして、上で紹介した手順で、移植性チェックを行った結果を以下に示す。ここでは、.NET Core 1.0/.NET Framework 4.6/.NET Standard 1.2/同1.3をチェック対象としている。.NET Standard 1.2と1.3をチェック対象としたのは、MyLibでは.NET Standard 1.3で追加されたAPIを使用していることが分かるようにするためだ。
実はInvalidProgramExceptionクラスは、.NET Standard 1.3で.NET Standardに追加されたクラスであり、ここではチェックに引っ掛かるようにわざと使用している。このように、.NET Portability Analyzerを使えば、個々のプラットフォームで利用できないAPIの洗い出しを簡単に行える。自分が書いたコードを別のプラットフォームでも使えるかどうかを調べたいときには積極的に活用したいツールだ。
.NET Portability Analyzerは、.NETプログラムの移植性をチェックするためのツールで、これを利用することで、ある環境で動作する.NETコードが別の環境で動作するかを簡単にチェックできる。.NET Framework、.NET Core、Xamarinなど、.NETコードを実行するプラットフォームが多岐にわたるようになった現在では非常に価値が高いツールだといえる。
Copyright© Digital Advantage Corp. All Rights Reserved.