検索
連載

.NET Portability AnalyzerDev Basics/Keyword

.NET Portability Analyzerは、さまざまなプラットフォームをまたいだ.NETプログラムの移植性をチェックするためのツール。

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

連載目次

 .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のインストールと利用

 .NET Portability AnalyzerはVS Marketplaceで配布されているので、これをダウンロード/インストールする(VSが起動しているのであれば、インストール後にVSを再起動)。

VS Marketplaceの.NET Portability Analyzerページ
VS Marketplaceの.NET Portability Analyzerページ

 インストールをしたら、移植性をチェックしたいプロジェクト(またはソリューション)をソリューションエクスプローラーで右クリックして、コンテキストメニューから[Analyze Assembly Portability]を選択するだけだ。

アセンブリの移植性をチェック
アセンブリの移植性をチェック

 コンテキストメニューから[Portability Analyzer Settings]を選択すれば、設定を行える。

.NET Portability Analyzerの設定画面
.NET Portability Analyzerの設定画面

 この画面では移植性のチェックを行う対象となる.NET実装のバージョン、出力形式を指定できる。上の画面では出力形式はHTMLとして、チェック対象のプラットフォームには.NET Core 1.0、.NET Framework 4.6などを指定していることが分かる。出力形式にはJSON、Excelも指定可能だ。

 解析を実行すると、次のようなウィンドウが表示されるので、[Open Report]リンクをクリックする。すると、解析結果が(この場合はWebブラウザに)表示される。

[Open Report]をクリック
[Open Report]をクリック
解析結果が表示される
解析結果が表示される

実行結果


 画面下部にある赤い「×」はチェック対象としたプラットフォームではサポートされていないことを示している。上の画像ではSystem.InvalidProgramExceptionクラスが.NET Standard 1.2ではサポートされていないことが示されている。そして「このアセンブリを.NET Standard 1.2(以下をサポートする)環境で利用するには、ここを修正する必要がある」ことが一目で分かるというわけだ。

 このように、.NET Portability Analyzerを使用することで、何らかの.NET環境上で動作するように作成したコード(多くの場合は、ライブラリやフレームワークなど、再利用されることを念頭に置いたもの)を他の.NET環境で動作させるのに、どんな変更が必要になるのか(必要ないのか)が簡単に判断できる。

実際の利用例

 ここでは例として次の3つのプロジェクトで構成されるソリューションを用意した。以降では、このソリューションを例として.NET Portability Analyzerの動作を見ていこう。

  • MyLib: 2つの静的メソッドを公開するPCLプロジェクト。.NET Standard 1.3に準拠
  • ConsoleApp46: MyLibを利用するコンソールアプリプロジェクト。.NET Framework 4.6を利用
  • ConsoleAppCore: MyLibを利用するコンソールアプリプロジェクト。.NET Core 1.0を利用

 .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");
  }
}

PCLが公開する2つのメソッド

 残る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();
    }
  }
}

MyLibが提供するメソッドを利用するコード

 プログラム自体の実行結果は次のようになる。

プログラムの実行結果
プログラムの実行結果

 そして、上で紹介した手順で、移植性チェックを行った結果を以下に示す。ここでは、.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コードを実行するプラットフォームが多岐にわたるようになった現在では非常に価値が高いツールだといえる。

参考資料


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

Dev Basics/Keyword

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る