.NET アップグレード アシスタントを利用して .NET Framework から .NET に超簡単アップグレード 【WPF アプリケーション】

こんにちは！

本記事では、.NET Framework から .NET の移行を手助けする ".NET アップグレード アシスタント" について紹介します。



## .NET へ移行を計画している方へ

.NET 5 が2020年にリリースされました。

新しい .NET の登場と共に  .NET Framework シリーズは、.NET Framework 4.8 が最後のメジャーアップデートであり、以降は新規機能の実装が行われません。

そのため、近い将来、現行の .NET Framework で作成されたアプリケーションは .NET へ移行を検討する必要があります。

特に、今年 (2021年) は LTS (Long Term Support) の対象である .NET6 がリリースされますので、.NET 6 をターゲットに移行計画を予定されている方も多いのではないでしょうか？

また、移行計画を立案する際に、気になるのは移行コストですね。

.NET Framework と .NET は、基本的にコード互換性はあるものの、一部の API 廃止や、プロジェクトファイルの構成の変更など、移行コストは決してゼロではありません。

その移行コストをなるべく抑え、移行作業を手助けしてくれる .NET アップグレード アシスタントというツールがあります。

https://docs.microsoft.com/ja-jp/dotnet/core/porting/upgrade-assistant-wpf-framework

.NET アップグレード アシスタントは  .NET Framework  のアプリケーションを .NET にアップグレードするツールです。

本記事では .NET アップグレード アシスタントを活用し、弊社で提供している WPF 技術トレーニング (下記記事) のソースコードに対して「簡単にアップグレードできるのか？」をデモしたいと思います。

https://blogs.jp.infragistics.com/entry/2020/11/06/144425


## .NET アップグレード アシスタント 

### .NET アップグレード アシスタント のインストール

.NET アップグレード アシスタントのインストール方法については、チュートリアルサイトにて紹介されていますので、ご確認ください。

https://dotnet.microsoft.com/platform/upgrade-assistant/tutorial/intro

> もしインストール失敗する場合は、下記コマンドもお試しください。
> "dotnet tool install -g upgrade-assistant --ignore-failed-sources"
> Github の説明によると、Nuget の設定によりインストールでエラーになる可能性があり、上記コマンドで回避出来ます。
> https://github.com/dotnet/upgrade-assistant

###  .NET アップグレード アシスタントの実行コマンド

コマンドライン上で、upgrade-assistant コマンドを実行します。

ソリューション、または、プロジェクトファイルを対象に実行します。

```
upgrade-assistant <MySolution.sln>
```

```
upgrade-assistant <MyProject.csproj>
```

###  .NET アップグレード アシスタントの実行デモ

それでは .NET Framework の WPF アプリケーションに対して .NET アップグレード アシスタントを実行してみます。

```
upgrade-assistant IG-WPF-STANDARD-SAMPLE.sln
```

#### 1) Back up project

まずは、バックアップを取得するか？について確認が行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/e866b41b-00e2-a67f-8f7b-d168622bf34d.png)


#### 2) Convert project file to SDK style

次に、プロジェクトファイルのコンバートが行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/158f274c-e90c-7405-426e-078aa57df72c.png)


#### 3) Clean up Nuget package references

Nuget パッケージのクリーンが行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/01111d51-1029-511a-15b2-c0efd7d47b7c.png)


#### 4) Update TFM

TFM (Target Framework) の更新が行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/9811752b-e6fa-af9d-95c7-faef5c547f34.png)


#### 5) Update Nuget Packages

Nuget パッケージの更新が行われます。

.NET で動作するために、必要な Nuget のパッケージなどが追加されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/951884cd-f771-8d89-e8b2-a5e89a5685fa.png)


(このステップは、処理時間が掛かりました (5分ほど)、大規模なプロジェクトであれば、より時間がかかるかもしれません)

#### 6)～8)は自動実行 

.NET の動作に必要なコンフィグファイルの追加や、.NET の C# コードで更新が必要のソースコードに対して、残りの更新が行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/fd75f298-dcef-3230-ae44-e5454532581c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/bae9213d-1b70-314a-c115-a63e327e6495.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/9073d10a-1cc2-a3a5-b175-4c52e6afa8df.png)



### アップグレード前後の変更内容の比較

今回のアップグレードの際に、変更が発生したソースコードは、プロジェクトファイルのみでした (バックアップファイルを除く)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/15cdb2c2-ba24-6b53-e51b-c674788c462c.png)



プロジェクトファイルの変更内容は以下です。
(左が .NET Framework / 右が .NET)

![diff.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/4adfed6b-0d89-7d85-fef3-a58937710b71.gif)


変更前後で比較すると、プロジェクトのファイルのコード量は 152行 -> 49行と、かなりコンパクトになりました。

軽量化された原因は、主に以下となります。

・各ソースコードのファイルパスの記載が .NET のプロジェクトでは不要になった ( .NET の場合は、ディレクトリ(サブディレクトリ含む)にあるファイルが、自動的に管理対象となるため)

・.NET Framework 時点では、参照設定する必要があったアセンブリ (System.Xml / System.Core など) が .NET では Nuget のパッケージでまとめられた

## ビルド&動作確認

それでは、ツールによりアップグレードが完了したので、ビルドおよび動作確認をしてみましょう。

まずは、アップグレードされたソリューションファイル (*.sln) を開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/13fd3e68-9e9c-2b2f-7509-5b73150e6c1a.png)


念のため、対象のフレームワークが ".NET 5.0" に更新された確認してみます。無事アップグレード出来ていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/d184e9c5-5d21-c258-70bd-8d56c8f251f4.png)



それでは、ビルド＆デバッグを実行してみます。正常にアプリケーションが起動できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/cc3efd36-2fb6-d181-7459-9f471ee0ed48.png)


## まとめ

個人的にアップグレードツールは、何かしら手こずる事が多い印象でしたが、.NET アップグレード アシスタントはスムーズにアップグレードできました。

.NET に移行の際、各プロジェクトファイルの再構成は非常に労力が掛かりますが、.NET アップグレード アシスタントがそれを手助けしてくるので、まずは、.NET アップグレード アシスタントでアップグレード、必要な細かい修正はその後に行う。というアプローチが効率が良いと感じました。

コマンド１つで非常に簡単に実行できますので、ぜひ試してみてください！

## UItimate UI for WPF トライアル版を利用するには

.NET 5対応の <a href="https://jp.infragistics.com/products/wpf" target="_blank">Ultimate UI for WPF</a> は、Microsoft® Officeライクで高パフォーマンスなデスクトップおよびタッチデバイス向けアプリケーションの開発効率化を支援します。高速なグリッドやチャート、動的なデータ視覚化といったWPFコントロールを100種類以上収録しています。

https://jp.infragistics.com/products/wpf


UItimate UI for WPF は<a href="https://jp.infragistics.com/products/wpf/download" target="_blank">トライアル版</a>での試用が可能です。<br>

製品に関する技術的な問い合わせは <a href="https://iam.infragistics.com/Account/Register" target="_blank">こちらのページ</a> よりアカウントの作成を行ってください。登録より30日間、弊社のテクニカルサポートをご利用いただくことが出来ますのでお気軽にお問い合わせください。<br>

また、製品をご購入をご検討のお客様は <a href="https://jp.infragistics.com/how-to-buy" target="_blank">こちらのページ</a> より


## 開発全般に関するご相談はお任せください！

インフラジスティックス・ジャパンでは、各開発プラットフォームの技術トレーニング、コンサルテーションの提供、開発全般のご支援を行っています。

https://jp.infragistics.com/service-and-support/professional-service


「古い技術やサポート終了のプラットフォームから脱却する必要があるが、その移行先のプラットフォームやフレームワークの検討が進まない、知見がない。」

「新しい開発テクノロジーを採用したいが、自社内にエキスパートがいない。日本語リソースも少ないし、開発を進められるか不安。」

「自社のメンバーで開発を進めたいが、これまで開発フェーズを外部ベンダーに頼ってきたため、ツールや技術に対する理解が乏しい。」

「UIを刷新したい。UIデザインやUI/UXに関する検討の進め方が分からない。外部のデザイン会社に頼むと、開発が難しくなるのではないか、危惧している。」

といったご相談を承っています。

お問い合せは<a href="https://jp.infragistics.com/about-us/contact-us#contactform" target="_blank">こちら</a>からお気軽にご相談ください。