Amazon Web Services ブログ

Porting Assistant for .NET を使用して、レガシー VB.NET アプリケーションを .NET 6.0 に移植する

本稿は Jignesh Suthar による記事 Port legacy VB.NET applications to .NET 6.0 with Porting Assistant for .NET を翻訳したものです。翻訳はソリューションアーキテクト 小杉 真一郎が担当しました。

2002 年のリリース以降、Visual Basic .NET (VB.NET) はWindows ベースのアプリケーション開発者から支持されてきました。2021 年 11 月にリリースされた .NET 6.0 では開発者にとって魅力的な機能が追加され、これらを利用することでアプリケーションを高速化し、信頼性を向上させ、保守を容易にすることが出来ます。また、.NET 6.0 で開発されたアプリケーションは Windows Server だけでなく、Linux 上で実行することも可能です。しかし、レガシーな .NET Framework アプリケーションでこれらの恩恵を享受するには、アプリケーションを .NET 6.0 に移植する必要があります。そこで役に立つのが、本稿でご紹介する Porting Assistant for .NETです。

AWS は最近、Porting Assistant for .NET において VB.NET で記述された .NET Framework アプリケーションの、 .NET Core 3.1、.NET 5、.NET 6 との互換性評価および移植がサポートされることを発表しました。 このリリースによって、VB.NET のクラスライブラリ、Web API、コンソールアプリケーションを .NET Core 3.1、.NET 5、.NET 6 に変換することで、VB.NET で記述されたレガシー .NET Framework アプリケーションを簡単にモダナイズできるようになり、.NET 6.0 への移植が簡素化されます。本稿では、レガシーな .NET Framework アプリケーションを最新の.NET に移植する方法について、手順を追って説明します。

Porting Assistant for .NET は、.NET Framework アプリケーションを .NET Core 3.1、.NET 5、.NET 6 に移植する際の作業を効率化するオープンソースの分析ツールであり、お客様が Linux にすばやく移行するのに役立ちます。移植において非互換な部分を識別し、既知の代替案を含む評価レポートを生成し、移植を支援します。Porting Assistant for .NET の詳細については、こちらのドキュメント及びアナウンスをご覧ください。

レガシーアプリケーションを最新バージョンの .NET に移植する際の課題

数年前、私はコンサルタントとして働いていたときに、ある企業のお客様でレガシーテクノロジープラットフォームのモダナイズおよび、 AWS への移行を支援しました。このプロジェクトでは、 テクノロジープラットフォーム全体を最新リリースの .NET Core に移植することになりました。 そこで私のチームは数週間以上かけて、互換性のある NuGet パッケージを特定したり、互換性のない API に代わるものをインターネットで検索したりしました。レガシーアプリケーションを最新バージョンの .NET に移植したことがあるソフトウェア開発者の方は、誰もが私の経験に共感できるのではないでしょうか。そのため、2020 年に C# 用の Porting Assistant for .NET の発表を聞いたとき、私はとても興奮しました。 私がコンサルタントとしてお客様のアプリケーションの移植を手伝っていたときに、このツールがあればどれだけよかったかと思います。もしそうであれば、チームの労力を数週間から数日に短縮できたかもしれません。

VB .NET Framework アプリケーションを .NET 6.0 に移植するためのステップバイステップガイド

このチュートリアルでは、開発者コミュニティで人気のある、nopCommerce アプリケーションのバージョン 3.80 をローカル環境で VB.NET に変換したものを利用します。

前提条件

このチュートリアルの前提条件は以下の通りです。

ステップ 1: nopCommerce アプリケーションをダウンロードする

nopCommerce アプリケーションのバージョン 3.80 は、次の git コマンドを使用してローカルにダウンロードできます。

1.	git clone https://github.com/nopSolutions/nopCommerce.git
2.	git checkout release-3.80

ステップ 2: nopCommerce ソリューションを VB.NET に変換する

nopCommerce アプリケーションのリリース 3.80 は、.NET Framework 4.5.1 を使用して C# で実装されています。 そのため、まずコードコンバーターツールを使用して C# から VB.NET に変換する必要があります。

1. Visual Studio マーケットプレイスからコードコンバーター拡張機能をダウンロードしてインストールします ( 図 1 )。

図 1. コードコンバーター拡張機能

2. nopCommerce ソリューションを右クリックして、[Convert to VB] を選択します ( 図 2)。

図 2. [Convert to VB] オプションメニュー

3. 変換には数分かかります。 変換が成功すると、変換された VB ソースファイルとプロジェクトを含むソリューションが再ロードされます。

ステップ 3: 互換性アセスメントの実行

次に、以下の手順で nopCommerce ソリューションの互換性アセスメントを実行します。

1. Porting Assistant for .NET を起動し、[Get started] をクリックします ( 図 3)。

図 3. アセスメントを開始するための [Get started] ボタン

2. [Assess a new solution] を選択し、ローカルドライブから nopCommerce.sln を選択します ( 図 4) 。

図 4. 新規でソリューションのアセスメントを開始

3. [Assess] を選択して評価を開始します ( 図 5)。 nopCommerce ソリューションはサイズが大きいため、完了するまでに数分かかります。

図 5. オプションを指定してアセスメントを開始

ステップ 4: ダッシュボードを使用してアセスメント結果を確認する

Porting Assistant for .NET ダッシュボードには、互換性のないパッケージや API を含む、アセスメント結果の簡単な概要と、移植済のプロジェクトの数が表示されます。
図 6 は、これまでに 35 件のプロジェクトのうち 0 件のプロジェクトが移植されたことを示しています。 また、NuGet パッケージは56 個のうち52 個に互換性がなく、APIは7167 個のうち 3289 個に互換性が無いことが分かります。

図 6. Porting Assistant for .NET ダッシュボード

ステップ 5: プロジェクトごとのアセスメント結果を確認する

Porting Assistant for .NET にはドリルダウン可能なインターフェースが用意されているため、ソリューションをクリックしてプロジェクトごとに互換性のアセスメント結果を確認することができます ( 図 7 )。

図 7. アセスメント結果の概要

ステップ 6: さまざまな評価ビューを確認する

Porting Assistant for .NET には、ProjectsProject referencesNuGet packagesAPIsSource filesという 5 つの異なる評価ビューが用意されています ( 図 8)。 これらのビューは、開発者がさまざまな観点から評価結果を分析するのに役立ちます。 NuGet packagesビューには、互換性のある依存関係、互換性のない依存関係の詳細および代替候補が表示されます(利用可能な場合のみ)。同様に、APIsビューには、互換性のない APIおよびそれが含まれているパッケージ、参照回数が表示されます。 最後に、Source filesビューを利用して、特定の API が呼び出されているソースの場所を特定できます。

図 8. 様々な評価ビュー

ステップ 7: プロジェクトリファレンスビューを確認する

評価ビューのうち、私のお気に入りはプロジェクトの依存関係を視覚的に表現できるプロジェクトリファレンスビューです。 これにより、開発者はどのプロジェクトを移植すべきかを迅速に決定し、全体的な労力を最小限に抑え、結果をすばやく確認することができます。
たとえば、図 9 を見ると、ほとんどのプロジェクトが Nop.Core ライブラリに依存していることがわかります。そのため、最初にこのライブラリ移植するのが理にかなっており、互換性の問題を短時間で解決するのに役立ちます。

図 9. プロジェクトの依存関係をグラフィカルに表示

ステップ 8: プロジェクトを移植する

プロジェクトビューでは、各プロジェクトの横にある右側のチェックマークを使用してすべてのプロジェクトを選択できますが、今回は Nop.Core のみを選択して移植を開始します。

1. Nop.Core の横にあるチェックマークを選択した後、[Port Project] をクリックします ( 図 10)。

図 10. 移植するプロジェクトを選択

2. 次に、移植したプロジェクトの保存先を指定します ( 図 11)。 [Modify source in place] または[Copy to new location]を選択できます。 リポジトリをクローンした場合は、[Modify source in place]オプションを利用することにより、Git バージョン管理システムを使用して変更を比較出来ます。

図 11. 移植したプロジェクトの保存先を指定

3. プロジェクトの規模と非互換性の数によっては、移植に数分かかる場合があります。 移植が完了すると、上部に通知が表示されます ( 図 12)。

図 12. プロジェクトの移植が完了

ステップ 9: プロジェクトをビルドして、コードの変更を確認する

移植が完了したら、最初にすべきことは、プロジェクトをコンパイルしてビルドし、ビルドエラーが発生しないか確認することです。
Porting Assistant for .NET のサジェスチョンエンジンは、顧客がテレメトリの共有を選択したときに、時間の経過とともに結果を学習して改善するように設計されています。 エンジンの背後にあるデータモデルは、数十万のユニークなパッケージと数百万のパッケージバージョンを分析した結果得られたもので、GitHubで入手できます。
それでは、Nop.Core ライブラリプロジェクトと関連するソースファイルで Porting Assistant for .NET が行ったコード変更を確認しましょう。

1. packages.config ファイルは削除されました ( 図 13)。

図 13. packages.config がプロジェクトから削除された

2. また、互換性のある NuGet パッケージが core.vbProj ファイルに追加されました ( 図 14)。

図 14. 互換性のある NuGet パッケージがプロジェクトファイルに追加

Porting Assistant for .NET が互換性のあるバージョンのパッケージを見つけることができない場合は、ソースを確認し、別の API またはアプローチを使用して手動で修正する必要があります。 これは反復的なプロセスになります。

ステップ10: 残りのプロジェクトについても同じプロセスを繰り返します。

nopCommerce ソリューションの移植を完了するには、残りのプロジェクトでもこのプロセスを繰り返す必要があります。 プロジェクト参照のグラフィカルビューを使用して、依存するプロジェクトの数に基づいて、次に移植するプロジェクトの優先順位を決定できます。

まとめ

本稿では、開発者が VB.NET のレガシーな .NET Framework アプリケーションを .NET 6.0 に移植する工数を削減するために、Porting Assistant for .NET がどのように役立つかを説明しました。 アプリケーションを .NET 6.0 に移植することで、開発者はアプリケーションのコンテナ化が可能になり、Amazon Elastic Container Service または Amazon Elastic Kubernetes Service でホストすることで、アプリケーションのモダナイゼーションを加速することが出来ます。さらにAWS Fargate を使用して、サーバーレスでコンテナを実行することも可能となります。 その上、Windows コンテナから Linux コンテナに移行すると、.NET アプリケーションを AWS でホストするライセンスコストの削減が可能となり、アプリケーションのスケーラビリティとパフォーマンスを向上させるだけでなく、ライセンス費用の削減も実現できます。

翻訳はソリューションアーキテクト 小杉 真一郎が担当しました。原文はこちらです。

投稿者について

Jignesh Suthar は、AWSのソリューションアーキテクトとして20年以上の経験を持ち、Fortune 500やスタートアップに対して、最先端のクラウド技術を用いたテクノロジープラットフォームの移行やモダナイズ、ベストプラクティスに従ったパブリッククラウドへのホスティングを支援しています。

翻訳者について

小杉 真一郎は、マイクロソフトワークロードを専門としたAWSのソリューションアーキテクトであり、日本市場におけるクラウドプラットフォームの活用およびモダナイズを支援しています。