C#でLinux向けのコンソールアプリケーションを構築する

はじめに

C#を使う機会があったので、まずはコンソールアプリケーションのクロスコンパイルについてメモしておく。
最近だと、UnityModを作るために使ったが、基本的な部分を理解するためにやってみる。

環境

Windows 11 Professional
WSL2 Ubuntu 24.04 LTS
Visual Studio 2022 Community

準備

Visual Studio 2022 Communityをインストール

https://visualstudio.microsoft.com/ja/ からインストールをする。
ここでは詳細な手順は記載しない。

コンソールアプリケーションの作成

1. Visual Studio 2022 Communityを起動する

2. 新しいプロジェクトの作成をする

console-app-01

3. コンソールアプリを選択して、「次へ」

console-app-02

4. プロジェクト名を入力して、「次へ」

console-app-03

5. フレームワークに 「.NET8.0」を選択する

console-app-04

6. プロジェクトが実行できることを確認する

「デバッグ」→「デバッグの開始」で実行できることを確認する。

console-app-05

ターミナルが開き、下記のような表示となっていればOK

console.log
Hello, World!

C:\Users\xxxxx\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug\net8.0\ConsoleApp1.exe (プロセス 32120) は、コード 0 (0x0) で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自 動的にコンソールを閉じる] を有効にします。
このウィンドウを閉じるには、任意のキーを押してください...

Linux向けのビルド

1. プロジェクトを右クリックし、「発行」を選択する

build-to-linux-01

2. ターゲット「フォルダ」を選択して、「次へ」

build-to-linux-02

3. 特定のターゲット「フォルダ」を選択して、「次へ」

build-to-linux-03

4. デフォルトのまま「完了」

build-to-linux-04

5. 実行プロファイル作成の進行状況

作成されていればOK

build-to-linux-05

6. ターゲットランタイムを選択

build-to-linux-06

7. ターゲットランタイム「linux-x64」で選択し、「保存」

※ここで、「単一ファイルの作成」とするとバイナリにランタイムが含まれる形となり、単一ファイルでの実行が可能となる。

build-to-linux-07

8. 「発行」を押す

build-to-linux-08

9. 公開が成功しているかの確認

build-to-linux-09

10. ディレクトリにファイルがあることを確認

build-to-linux-10

WSL2 (Ubuntu24.04 LTS)で実行をする

https://learn.microsoft.com/ja-jp/dotnet/core/install/linux を参考に、WSL2.NETのランタイムをインストールする。

今回は、手動インストールで入れる。
https://learn.microsoft.com/ja-jp/dotnet/core/install/linux-scripted-manual#manual-install

1. .NET Runtime 8.0.10をインストールする

下記から、x64を選択する。

install-dotnet-runtime-01

dotnet-runtime-8.0.10-linux-x64.tar.gz というファイルがダウンロードされる。

2. ダウンロードしたファイルのインストール

ユーザのホームディレクトリの直下に、dotnet-runtime-8.0.10-linux-x64.tar.gzを配置し、下記を実行する。

DOTNET_FILE=dotnet-runtime-8.0.10-linux-x64.tar.gz
export DOTNET_ROOT=$HOME/.dotnet

mkdir -p "$DOTNET_ROOT" && tar zxf "$DOTNET_FILE" -C "$DOTNET_ROOT"

export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools

起動時にパスが通るように、.zshrcの一番下に下記を記載する。

zshrc
export DOTNET_ROOT=$HOME/.dotnet
export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools

3. コンソールアプリケーションのバイナリを配置

~/workspace/csharp-console-appにバイナリを配置するディレクトリを作成する。

mkdir -p  ~/workspace/csharp-console-app 

以下のファイルを配置する。

ConsoleApp1
ConsoleApp1.dll
ConsoleApp1.runtimeconfig.json
ConsoleApp1.deps.json

ConsoleApp1.pdbはデバッグ用のファイルのため、リリース時には不要とのこと。
※今回は、ConsoleApp1.deps.json がなくても実行できたが、ライブラリの依存関係がある場合は必要となるようだ。

https://learn.microsoft.com/ja-jp/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-8-0

4. バイナリの実行

ConsoleApp1 を配置後、実行権限を付与する。

chmod +x ConsoleApp1
./ConsoleApp1

ConsoleApp1 は 単一のバイナリを生成するように設定した場合に生成されるかもしれないが、通常の実行には .dll ファイルが使用されるとのこと。

dotnet ConsoleApp1.dll

でも実行できるようだ。
むしろMicrosoftのチュートリアルではこちらが推奨されているようだ。

参考

おわりに

C# + .NETのコンソールアプリケーションのクロスコンパイルについて記載した。
WSLのおかげでLinux環境での実行が楽に検証できるので助かる。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。