.NETコードのターゲットを変更する

.NETプラットフォームが導入されて以来、年々人気が上がり、多くのプラットフォームとデバイスに広まっている。開発者がプロジェクトをあるプラットフォームから他に移行するときに障害となるのは、対象となるプラットフォームから要求されるAPIであることが多い。Microsoftは.NET Portability Analyzer (NPA) を提供し、この移行プロセスを容易にするための努力をしてきた。

MicrosoftのTaylor Southwick氏とConnie Yau氏はSeth Juarez氏がホストしたChannel 9の議論において、NPAでできることと、自身のプロジェクトで開発者がどのようにそれを使えるかについて話した。NPAはあるプラットフォームから他に切り替えるときの問題に開発者が対処する補助になるように設計されている。このツールはソースと対象のプラットフォームの選択に制限されるものではなく、あらゆる組み合わせの移行に使用できる (たとえば、Windows PhoneからSilverlightや、Xamarin.Androidから.NET Coreなど)。

ソースプロジェクトに対して実行すると、NPAは使われているAPIを識別して、移行対象のプラットフォームに移行するためにはなにを変更する必要があるのかを検出する。現在サポートされているのは以下である:

  • デスクトップのすべてのバージョンの.NET Framework
  • Silverlight
  • Xamarin
  • Mono 3.3
  • Windows 8
  • Windows Phone
  • .NET Core

オフライン解析モードでは、デフォルトでWebサービスを経由してコードベースの解析に関する情報がMicrosoftに送られることに注意が必要だ。この解析では、Webサービス(ポータビリティサービス)にAPIのリストを渡して、ターゲットに対してなにをするかと、それらのターゲットでAPIをどうするかを生成する。この解析では、「ポータビリティインデックス」として他のプラットフォームで提供されていないAPIの割合の詳細をユーザーに返すレポートを生成する。これはAPIがいくつ使われているかは教えてくれない--単に使われているかどうかだけである。(APIが1回使われていても100回使われていてもスコアは同じである。)

Webサービスがプロセスの一部として使われている理由は2つある。Microsoftは簡単な方法で更新し続けたく、また顧客がどんなAPIを使っているのかを学習したいと考えている。この情報は、Microsoftがデスクトップから.NET CoreやASP.NETなど「次の」バージョンにどんなAPIを移行するべきかを決める補助になる。

これらはプライバシーの問題や開発環境がインターネットに接続できないといった問題に対して、オフラインモードが提供されており、NPAはこれをサポートするために再コンパイルできる。MicrosoftはWebサービスを通じて彼らのサーバーに送信される情報を減らそうとしている。この合理化プロセスの一部としてツールはMicrosoftの対応するAPIがなにかを確定するためにMicrosoft APIデータのみが送信されるようにしようとする。コマンドラインオプションを使用して、Microsoftになにが送信されているかを表示することも可能である。通常は以下の情報がMicrosoftに送信されている:

  • 使用されているAPI
  • 参照されているアセンブリ
  • コードのアセンブリ名

ツールは以下の3つの異なるレポートフォーマットを提供する:

  • HTMLレポート – あなたのライブラリをどうポータブルにできるかの概要
  • Excelスプレッドシート–使用されているものをフィルターするのに便利
  • JSONファイルフォーマット– 他のプログラムツールに連携するのに便利

NPAのソースコードはMicrosoftのオープンソースの一部としてGitHubで提供されている。コマンドラインツールに関連して、Visual Studio内でNPA機能を提供する拡張が存在する。 これはVS2013とVS2015の拡張機能ギャラリーで提供されている

Visual Studioからツールをを使用する利点は、レポートに加えて、エディタのメッセージとしてあなたのコードの移植性の問題も提供できるため、あなたのコード内にあるそれぞれの問題点の正確な位置を追跡できるようになる。可能であればどのようにコードを修正すればよいかを提案し、特定のコードに移動できるため、時間を節約できる。 (現在、Visual Studio拡張はHTMLレポートに限定されている。)