昔作った .NET Frameworkアプリを .NET Coreにしてみた
はじめに
こんにちは、SHIFTでインフラコンサルタントをしている大竹です。
昔、C#での大規模開発に携わっていたこともあり、日曜プログラミング等で作成したちょっとしたツールがいくつかあります。ふと、思い立って試しに最新バージョンに変換してみようと思い、やってみました。 対象のプログラムは、古いものだとVisual Studio Version 10の頃に作ったものです。かなり古いのでちゃんとバージョンアップできるか心配でしたが、結果的には簡単なプログラムだったこともあってか、割とスムーズにできました。 とはいうものの、躓いたポイントもあったので、簡単な流れと対処について紹介したいと思います。
事前準備
前提として、以下の環境を想定しています。
Windows 10 or 11
Visual Studio 2022 (Community 以上)
dotnet コマンド
.NET Coreを利用するならdotnetコマンドは使える状態だと思いますので、dotnetやVisual Studioのインストール方法は省略します。
PowerShellなどのコマンドラインツールで下記のコマンドを実行し、.NET Frameworkアプリを .NET Coreにアップグレードするツールをインストールします。
dotnet tool install -g upgrade-assistant
いざアップグレード
アップグレードツールをインストールしたら、コマンドラインで .NET Frameworkのソリューションファイルを指定し、下記のコマンドを実行します。
upgrade-assistant upgrade "C:\xxx\projects\sample\sample.sln"
アップグレードのプロセスが始まります。基本的にはPowerShell上にインタラクションが表示されていくので、それに従えば良いです。ソリューション配下のプロジェクトごとにアップグレードが実行されていくので、表示される説明や選択肢を確認しながら、番号やEnterを入力していきます。
PS C:\> upgrade-assistant upgrade "C:\xxx\projects\sample\sample.sln"
-----------------------------------------------------------------------------------------------------------------
Microsoft .NET Upgrade Assistant v0.4.336902+3a2177acaa53d719e5da4ccde275f84ff18f0611
We are interested in your feedback! Please use the following link to open a survey: https://aka.ms/DotNetUASurvey
-----------------------------------------------------------------------------------------------------------------
[00:07:11 INF] Loaded 8 extensions
[00:07:14 INF] Using MSBuild from C:\Program Files\dotnet\sdk\6.0.100\
[00:07:14 INF] Using Visual Studio install from C:\Program Files\Microsoft Visual Studio\2022\Community [v17]
[00:07:19 INF] Initializing upgrade step Select an entrypoint
[00:07:19 INF] Setting entrypoint to only project in solution: C:\xxx\projects\sample\sample.csproj
[00:07:19 INF] Initializing upgrade step Select project to upgrade
[00:07:19 INF] Initializing upgrade step Back up project
Upgrade Steps
Entrypoint: C:\xxx\projects\sample\sample.csproj
Current Project: C:\xxx\projects\sample\sample.csproj
1. [Next step] Back up project
2. Convert project file to SDK style
3. Clean up NuGet package references
a. Duplicate reference analyzer
b. Package map reference analyzer
c. Target compatibility reference analyzer
(中略)
Choose a command:
1. Apply next step (Back up project)
2. Skip next step (Back up project)
3. See more step details
4. Configure logging
5. Exit
> 2
(中略)
Please press enter to continue...
(中略)
[00:17:46 INF] Upgrade has completed. Please review any changes.
小さいソリューションでも十数回入力することになるので、何度も同じインタラクションを入力するのが面倒だと言う場合は、オプションを用いてこのプロセスを省略することもできます。(業務システムの場合はおすすめしませんが…)
upgrade-assistant upgrade --skip-backup --non-interactive "C:\xxx\projects\sample\sample.sln"
(中略)
[00:17:46 INF] Upgrade has completed. Please review any changes.
ビルドしてみる
アップグレードされたソリューションを開いてみましょう。ソリューション自体はきちんと最新版にアップグレードされていると思います。では、.NETのバージョンはどうでしょうか? プロジェクトのプロパティを開いてみましょう。
こちらもきちんとアップグレードされていました。ではこれをビルドしてみましょう。
指定された RuntimeIdentifier 'linux-x64' で利用できる Microsoft.WindowsDesktop.App.WindowsForms のランタイム パックがありませんでした。
そうそう余裕には行きませんね、エラーが発生してしまいました。このプログラムではWindows Formのライブラリは使わないので、該当のフレームワークを削除すれば良いかと考えたのですが、どうにも削除できません。
プロジェクトファイルをエディタで開いてみると、下記のような設定が追加されていることに気づきました。
<UseWindowsForms>true</UseWindowsForms>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
前述のようにWindows Formを使う必要は無いので、この設定をfalseにしました。
<UseWindowsForms>false</UseWindowsForms>
<ImportWindowsDesktopTargets>false</ImportWindowsDesktopTargets>
すると、無事にビルドが通るようになりました。
1>プロジェクト "xxx.csproj" のビルドが終了しました。
========== ビルド: 1 正常終了、0 失敗、1 更新不要、0 スキップ ==========
Linux用にリリースする
Linuxで実行できるようにリリースしてみましょう。まず、エントリーポイントとなるプロジェクトを右クリックし、「発行」を選択します。
PC上で実行できればいいので、ターゲットはひとまずローカルフォルダを選択していきます。
フォルダーの場所を指定して、完了します。
続いて公開の設定を変更します。ターゲットランタイムの編集アイコンをクリックします。
ターゲットランタイムをLinuxのもの(今回の環境ではlinux-x64)に変更し、保存します。
これで発行を実行すれば、指定したフォルダーに対してLinux用にビルドされたライブラリ群がリリースされます。
Linux環境で .NET Coreアプリを実行してみる
せっかくなので実際にLinuxで実行したいところですが、手元にLinux環境がないので、以前にも紹介したWSL2(Windows Subsystem for Linux)で実行してみたいと思います。
WSL2に .NET Coreを実行するためのパッケージを取得し、インストールします。
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update && \
sudo apt-get install -y dotnet-runtime-6.0
最後に、リリースされたディレクトリに移動して下記のコマンドでDLLを指定し、アプリケーションを実行します。Windowsで実行するのと違い、実行ファイルの拡張子はexeではないことに注意しましょう。
dotnet sample.dll
実行できました!
Hello, World!
Linuxで .NETが実行できるようになったと噂には聞いていましたが、本当にできるんですね~(今更)。
《そのほかの記事》
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/