AWSから提供されている Porting Assistant for .NETを使って.NET Frameworkを.NET Coreへ移植する

2021.08.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

みなさま .NET Frameworkはまだ現役で使ってますか。
.NET Coreの登場からしばらく経ち、運用環境でもよく見られるようになり、移植を検討されている方も増えていると思います。

アプリケーションを.NET Frameworkから.NET Coreに移植する場合、次のような移植を支援するツールを利用することが可能です。

実は、AWSからも"Porting Assistant for .NET"という.NET Coreへの移行アシスタントツールが提供されています。

本日は何が出来るのかを軽く確認しました。移植を検討されている方の候補になれば幸いです。

Porting Assistant for .NETとは

.NET Frameworkアプリケーションを .NET Coreアプリケーションへ移植する際の支援ツールです。
主に以下の2つの機能が提供されています。

  • 互換性の評価
  • 移植の支援

互換性の評価機能でプロジェクトをスキャンし、パッケージと各APIの互換性有無を評価します。
その後、移植の支援機能で互換性のあるバージョンにアップグレード操作を行うことが出来ます。

あくまでも移行支援ツールであるため、手動でのソースコード修正、リファクタリングを回避するためのものではないので、その点はご注意ください。

現時点で、移行元のバージョンは.NET Framework3.5以降が対象です。
また、移行先のバージョンは.NET Core 3.1もしくは .NET5.0が対象となっています。

本ツールはWindows上で動作します。

準備

スタンドアロンツールと、Visual Studio拡張の2種類存在しています。
以下からダウンロード、インストールを行います。VS拡張の場合はVisual Studio マーケットプレイスからインストールします。

また、利用にあたってAWSアカウントとIAMユーザーのアクセスキー、シークレットキーが必要になります。
以下のポリシー設定が必要です。

ためしてみた

試しに私が数年前に作成したリポジトリを使ってみます。
何のために作ったのか全く覚えてないですが、4年ほど前に作成したASP.NET MVCプロジェクトのようです。

バージョンは.NET Framework 4.5.2なので、移行元の対象に含まれていますね。

EntityFrameworkやNewtonsoft.Jsonといった標準的なパッケージが使われています。

ツールを起動して、ソリューションファイルを渡すと解析が始まります。

解析が終了すると、互換性に関するレポートがサマリ形式で表示されます。
私が作成したプロジェクトは非互換の部分がだいぶ多いですね。

互換性のある、ないパッケージやAPI利用箇所の洗い出しがされています。
このまま移植は出来ないですが、移植にあたってどの程度リファクタリングが必要になるかちょっと参考になりそうです。

本日は移植支援部分も実施したいので、もうちょっとシンプルなコンソールアプリを作ってやってみます。

using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.Net;

namespace ConsoleAppHoge
{
    class Program
    {
        static void Main(string[] args)
        {
            var req = WebRequest.Create("https://classmethod.jp/");
            var res = req.GetResponse();
            Console.WriteLine(((HttpWebResponse)res).StatusDescription);

            var person1 = new Person { Name = "hoge", Age = 4 };
            Console.WriteLine(JsonConvert.SerializeObject(person1));

            Process.Start("calc");
            Console.Beep();
            Console.ReadLine();
        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

全て互換性ありとの結果が出ました。

Visual Studio 拡張機能からの評価と移行

先程作成したコンソールアプリを使って、Visual Studio拡張の Porting Assistant を使ってみます。
Run Full Assessment with Porting Assistantで互換性評価が実施されます。

Port Solution to .NET Core with Porting Assistantから自動移行が実施出来ますので試してみます。
取り消しが出来ない注意アラートなど表示されますが、特にパラメータの指定などなくOK操作をしていけば完了します。

移行完了後、フレームワークバージョンが.NET Core 3.1に変更されています。
出力の種類がクラスライブラリになっていたので、そこはコンソールアプリに変更しました。
また、Newtonsoft.Json .NET Core対応バージョンの再インストールを行いました。

実行してみると問題なく動作します。

まとめ

シンプルなものなら簡単に移植できました。
実際に数行のコンソールアプリを移植するケースは無いと思いますので、Webアプリケーションなど使ってもう少し検証を行う必要がありそうです。
無料なので是非は試してみてください。互換性評価の見積もりにだけでも使えると思います。

なお、それぞれのプラットフォームごとにどの程度まで移行精度が高いのか、などは別途記事にまとめたいと思います。