【C#】.NET 6 のコンソールアプリをLinux上で動作させる

.NET Core以降からマルチプラットフォーム化したとのことで、WindowsだけでなくLinuxやMacでも動くようになりました。実際に試したことがなかったため、本当に動くのか試してみました。

今回はコンソールアプリを動かしてみたいと思います。

【検証環境】.NET 6 / WSL Ubuntu 22.04 LTS

WSLをインストール

検証に使うLinux環境はWSL(Windows Subsystem for Linux)を利用します。

WSLの概要やインストールなどはこちらのサイトを参考にしました。

MicroSoft Store からUbuntuをインストールできるようです。

Linuxにアプリをデプロイ

Ubuntuで動かすコンソールアプリを用意します。

Console.WriteLine("Hello, Ubuntu!");

作成したコンソールアプリのプロジェクトを一旦フォルダに発行します。

発行の際に設定から、配置モードを自己完結フレームワーク依存の二つから選択することになります。

自己完結

自己完結にすると、.NET Runtimeをインストールしていなくても動作させることが可能となります。ただし、発行フォルダのサイズが大きくなります。

ファイルの発行

すべての設定を表示から、プロファイル設定を開きます

配置モードを自己完結、ターゲットランタイムをlinux-x64に設定して保存します。

発行したフォルダをみてみると、容量は約70MBでした。画像の下にも続いていて、大量のdllなどのファイルが含まれていることが確認できます。

実はこれらの大量のファイルをひとまとめにしたバイナリファイルを生成する方法もあります。下記の画像のように、ファイルの公開オプション > 単一ファイルの作成 にチェックを入れます。

https://devadjust.exblog.jp/27784413/

ひとつのファイルにまとめられたことが確認できました。こちらの方が少し容量が小さくなってますね。

アプリの実行

上記で発行したファイルをUbuntuにコピーします(「/mnt/d/」でWindowsのDドライブを表現します)

※パスは環境に合わせて変更してください

$ cp /mnt/d/Test/ConsoleApp1/bin/Release/net6.0/publish/linux-x64/ConsoleApp1 /tmp/

コピーしたバイナリファイルを下記のようにして実行することができます

$ /tmp/ConsoleApp1
Hello, Ubuntu!

フレームワーク依存

フレームワーク依存では.NET Runtimeのインストールが必要になります。その分発行されるファイルの容量は小さくなります。

ファイルの発行

実際に発行してみると、自己完結と比べて非常に小さいことが確認できます。

アプリの実行

今回は単一ファイルではなく、dllも含めてUbuntuにコピーして実行してみたいと思います。

-r を付けないと怒られてしまいました。

$ cp -r /mnt/d/Test/ConsoleApp1/bin/Release/net6.0/publish/linux-x64 /tmp/

.NETをインストールしていない状態で下記コマンドを実行すると、エラーになりま、、、せんでした。

理由はよくわかりません(^^; WSLだからなのかもしれませんね。また調査してみます。

$ /tmp/linux-x64/ConsoleApp1
Hello, Ubuntu!

一応.NETのインストール手順も記載しておきます

https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu#2204

署名のインストールと、SDKのインストールを行います

# 署名のインストール
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

# SDKのインストール
sudo apt-get update; 
  sudo apt-get install -y apt-transport-https && 
  sudo apt-get update && 
  sudo apt-get install -y dotnet-sdk-6.0

dotnet コマンドでアプリを実行します(dotnet コマンドの場合はdllを指定)

$ dotnet /tmp/linux-x64/ConsoleApp1.dll
Hello, Ubuntu!

Leave a Reply

Your email address will not be published. Required fields are marked *