はじめに
C#
を使う機会があったので、まずはコンソールアプリケーションのクロスコンパイルについてメモしておく。
最近だと、Unity
のMod
を作るために使ったが、基本的な部分を理解するためにやってみる。
環境
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. 新しいプロジェクトの作成をする
3. コンソールアプリを選択して、「次へ」
4. プロジェクト名を入力して、「次へ」
5. フレームワークに 「.NET8.0」を選択する
6. プロジェクトが実行できることを確認する
「デバッグ」→「デバッグの開始」で実行できることを確認する。
ターミナルが開き、下記のような表示となっていればOK
Hello, World!
C:\Users\xxxxx\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug\net8.0\ConsoleApp1.exe (プロセス 32120) は、コード 0 (0x0) で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自 動的にコンソールを閉じる] を有効にします。
このウィンドウを閉じるには、任意のキーを押してください...
Linux向けのビルド
1. プロジェクトを右クリックし、「発行」を選択する
2. ターゲット「フォルダ」を選択して、「次へ」
3. 特定のターゲット「フォルダ」を選択して、「次へ」
4. デフォルトのまま「完了」
5. 実行プロファイル作成の進行状況
作成されていればOK
6. ターゲットランタイムを選択
7. ターゲットランタイム「linux-x64」で選択し、「保存」
※ここで、「単一ファイルの作成」とするとバイナリにランタイムが含まれる形となり、単一ファイルでの実行が可能となる。
8. 「発行」を押す
9. 公開が成功しているかの確認
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
を選択する。
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
の一番下に下記を記載する。
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
がなくても実行できたが、ライブラリの依存関係がある場合は必要となるようだ。
4. バイナリの実行
ConsoleApp1
を配置後、実行権限を付与する。
chmod +x ConsoleApp1
./ConsoleApp1
ConsoleApp1
は 単一のバイナリを生成するように設定した場合に生成されるかもしれないが、通常の実行には .dll ファイルが使用されるとのこと。
dotnet ConsoleApp1.dll
でも実行できるようだ。
むしろMicrosoftのチュートリアルではこちらが推奨されているようだ。
参考
Linux に .NET をインストールする
https://learn.microsoft.com/ja-jp/dotnet/core/install/linuxチュートリアル: Visual Studio を使用して .NET コンソール アプリケーションを発行する
https://learn.microsoft.com/ja-jp/dotnet/core/tutorials/publishing-with-visual-studio?pivots=dotnet-8-0
おわりに
C#
+ .NET
のコンソールアプリケーションのクロスコンパイルについて記載した。
WSLのおかげでLinux
環境での実行が楽に検証できるので助かる。