C#はLinuxで使える?開発環境の構築から実行・デプロイまで初心者向けに徹底解説
はじめに
C#と聞くと、「Windowsで使う言語」「Visual Studioがないと開発できない」というイメージを持つ人も多いかもしれません。しかし現在のC#は、Linuxでも問題なく開発・実行できます。特に.NETがクロスプラットフォーム対応になってからは、UbuntuやDebian、FedoraなどのLinux環境でC#アプリを作り、サーバーやDocker、クラウドにデプロイすることも一般的になっています。
この記事では、「c# linux」で調べている初心者に向けて、C#がLinuxで使える理由、開発環境の構築方法、基本的な実行手順、デバッグ、デプロイ、トラブルシューティングまでを一通り解説します。コンソールアプリからWeb API、Linuxサーバーでの常駐実行まで、C#をLinuxで使うための全体像をつかめる内容です。
1. C#はLinuxで使える?まず結論を初心者向けに解説
1-1. C#はLinuxでも開発・実行できる
結論から言うと、C#はLinuxでも開発できます。Linux上に.NET SDKをインストールすれば、ターミナルからdotnetコマンドを使ってC#プロジェクトを作成し、ビルドし、実行できます。
たとえば、Ubuntuのターミナルで次のような流れでC#アプリを作れます。
Bashdotnet new console -o HelloLinux
cd HelloLinux
dotnet run
これだけで、Linux上でC#のコンソールアプリを実行できます。エディタはVisual Studio Code、Vim、Neovim、JetBrains Riderなどを使えます。特に初心者には、補完やデバッグ機能を使いやすいVS Codeがおすすめです。
現在の.NETは、Windows、Linux、macOSでサポートされるクロスプラットフォームの開発基盤として提供されています。Microsoft公式サイトでも、.NETはLinux、macOS、Windowsでアプリを構築・実行できるものとして案内されています。
1-2. LinuxでC#が使える理由は.NETのクロスプラットフォーム対応
LinuxでC#が使える理由は、C#そのものというより、実行基盤である.NETがクロスプラットフォーム対応しているからです。
C#で書いたコードは、.NETの仕組みによってビルドされ、Linux上の.NETランタイムで実行されます。以前は「C#=Windows向け」という印象が強かったものの、現在の.NETはオープンソースで、WindowsだけでなくLinuxやmacOSでも利用できます。
そのため、次のような開発がLinux上で可能です。
C#コードを書く
↓
dotnet buildでビルドする
↓
dotnet runで実行する
↓
dotnet publishで公開用ファイルを作る
↓
LinuxサーバーやDocker、クラウドにデプロイする
特にASP.NET Coreを使えば、Linuxサーバー上でWebアプリやWeb APIを動かすこともできます。Microsoftの公式ドキュメントでも、ASP.NET CoreアプリをLinux上でNginxの背後に配置し、Kestrelと組み合わせて運用する方法が紹介されています。
1-3. Windows専用のC#アプリとLinux対応アプリの違い
C#で作られたアプリがすべてLinuxで動くわけではありません。重要なのは、「そのアプリがどの技術に依存しているか」です。
Linuxで動かしやすいC#アプリは、主に次のようなものです。
コンソールアプリ
ASP.NET CoreのWebアプリ
Web API
バッチ処理
バックグラウンドサービス
Docker化されたアプリ
クロスプラットフォーム対応ライブラリを使ったアプリ
一方で、Windows専用技術に依存しているアプリは注意が必要です。たとえばWindows FormsやWPFは.NETでも利用できますが、基本的にはWindows専用のデスクトップ技術です。Microsoftの移行ドキュメントでも、Windows FormsとWPFは.NETで利用可能ではあるものの、Windows専用技術として説明されています。
つまり、LinuxでC#を使いたい場合は、最初からLinux対応を前提にしたプロジェクト構成にすることが大切です。WebアプリやAPI、CLIツール、サーバーアプリなら、Linuxとの相性はかなり良いです。
1-4. LinuxでC#を使うメリット・デメリット
LinuxでC#を使うメリットは、サーバー運用やDocker、クラウド環境と組み合わせやすいことです。多くのWebサーバーやクラウド環境ではLinuxが使われているため、開発段階からLinuxで動作確認しておくと、本番環境との差を小さくできます。
主なメリットは次のとおりです。
Linuxサーバーと相性が良い
Docker環境で動かしやすい
ASP.NET CoreによるWeb API開発ができる
コマンドライン中心で軽量に開発できる
Windowsライセンスに依存しない環境を作りやすい
CI/CD環境に組み込みやすい
一方で、デメリットや注意点もあります。
Windows FormsやWPFはLinuxでは基本的にそのまま使えない
Linuxの権限やファイルパスに慣れる必要がある
ディストリビューションごとにインストール手順が少し異なる
ネイティブライブラリ依存のエラーが起きることがある
Visual Studio本体はLinux版が提供されていない
初心者がLinuxでC#を始めるなら、まずはコンソールアプリやASP.NET Coreから始めるのが安全です。Windows専用GUIアプリをLinuxに移植するよりも、最初からクロスプラットフォーム前提で作る方が学習しやすく、トラブルも少なくなります。
2. LinuxでC#開発を始める前に知っておきたい基礎知識
2-1. C#・.NET・.NET SDK・ランタイムの違い
LinuxでC#を使う前に、まず用語を整理しておきましょう。初心者が混乱しやすいのが、C#、.NET、.NET SDK、ランタイムの違いです。
C#はプログラミング言語です。実際に自分が書くコードの文法や構文を指します。
.NETは、C#などの言語でアプリを作るための開発・実行基盤です。ライブラリ、ランタイム、コマンドラインツールなどを含みます。.NETは無料のオープンソースかつクロスプラットフォームのフレームワークとして提供されています。
.NET SDKは、開発に必要な道具一式です。dotnet new、dotnet build、dotnet runなどのコマンドを使うにはSDKが必要です。C#を書いて開発する人は、基本的に.NET SDKをインストールします。
ランタイムは、ビルド済みの.NETアプリを実行するためのものです。開発はせず、サーバーでアプリを動かすだけならランタイムだけで足りる場合があります。
整理すると、次のようになります。
| 用語 | 役割 |
|---|---|
| C# | プログラミング言語 |
| .NET | C#アプリを作るための開発・実行基盤 |
| .NET SDK | 開発・ビルド・実行に必要なツール一式 |
| .NETランタイム | 作成済みアプリを実行するための環境 |
LinuxでC#開発をするなら、まずは.NET SDKを入れれば大丈夫です。SDKには対応するランタイムも含まれるため、初心者は「開発PCにはSDK、本番サーバーには必要に応じてランタイム」と覚えておくとわかりやすいです。
2-2. .NET Framework・.NET・Monoの違い
C#関連の情報を調べていると、「.NET Framework」「.NET」「Mono」という言葉が出てきます。これらは似ていますが、用途や歴史が異なります。
.NET Frameworkは、主にWindows向けに使われてきた従来の.NET環境です。古い業務アプリやWindowsデスクトップアプリでは今でも使われることがありますが、Linuxで新規開発する場合の第一候補ではありません。
現在主流の.NETは、かつて.NET Coreと呼ばれていた流れを引き継ぐクロスプラットフォーム対応の.NETです。LinuxでC#を使う場合は、基本的にこの.NETを使います。
Monoは、かつてLinuxやmacOSなどでC#を動かすためによく使われていた実装です。現在でも一部の用途で使われますが、一般的なサーバーアプリやWeb API、コンソールアプリを作るなら、まずは公式の.NET SDKを選ぶのが自然です。
初心者は次のように考えるとよいでしょう。
新しくLinuxでC#を始める → .NET SDKを使う
古いWindowsアプリを扱う → .NET Frameworkの知識が必要な場合がある
特殊な互換用途や一部環境 → Monoが関係する場合がある
2-3. Linuxで作れるC#アプリの種類
LinuxでC#を使うと、さまざまな種類のアプリを作れます。特に相性が良いのは、サーバーサイドやコマンドライン系のアプリです。
代表的なものは次のとおりです。
| アプリの種類 | 例 |
|---|---|
| コンソールアプリ | 学習用プログラム、CLIツール、バッチ処理 |
| Web API | REST API、バックエンドAPI |
| Webアプリ | ASP.NET Core MVC、Razor Pages、Blazorなど |
| バックグラウンドサービス | 常駐処理、ジョブ実行、キュー処理 |
| Dockerアプリ | コンテナ化されたWeb APIやバッチ |
| クラウドアプリ | Azure、AWS、Google Cloud上で動くアプリ |
| IoT・小型端末向け処理 | Raspberry Piなどで動くC#プログラム |
特にLinuxサーバーでは、ASP.NET CoreのWeb API、Worker Service、コンソールアプリがよく使われます。フロントエンドはJavaScriptやTypeScript、バックエンドはC#、実行環境はLinuxという構成も一般的です。
2-4. Ubuntu・Debian・Fedoraなど対応ディストリビューションの考え方
Linuxといっても、Ubuntu、Debian、Fedora、Red Hat Enterprise Linux、Alpine Linux、openSUSEなど多くのディストリビューションがあります。.NETは複数のLinuxディストリビューションで利用でき、パッケージマネージャー、Snap、手動インストール、コンテナイメージなどの方法で導入できます。
初心者にはUbuntuがおすすめです。理由は、利用者が多く、情報も豊富で、VS CodeやDockerとの組み合わせも使いやすいからです。サーバー用途ではUbuntu Server、Debian、RHEL系のディストリビューションもよく使われます。
注意点として、.NETのインストール方法はディストリビューションやバージョンによって異なります。たとえば、Ubuntuではapt、Fedoraではdnf、openSUSEではzypperを使うことが多いです。Microsoftの公式ドキュメントでも、Linux向け.NETはディストリビューションごとに案内されています。
迷った場合は、次のように選ぶとよいでしょう。
学習用PC → Ubuntu Desktop
サーバー学習 → Ubuntu Server
Docker中心 → UbuntuまたはDebianベースの環境
企業系サーバー → RHEL系、Ubuntu LTS、Debianなど
軽量コンテナ → Alpine Linuxも選択肢
3. LinuxにC#開発環境を構築する手順
3-1. 必要なもの:Linux環境・ターミナル・エディタ
LinuxでC#開発を始めるために必要なものは多くありません。基本的には次の3つがあれば始められます。
Linux環境
ターミナル
コードエディタ
Linux環境は、実機にインストールしたUbuntuでも、仮想マシンでも、WSL上のLinuxでも構いません。ただし、この記事では「Linux上でC#を開発・実行する」前提で説明します。
ターミナルでは、dotnetコマンドを使ってプロジェクト作成、ビルド、実行、テスト、公開を行います。LinuxでのC#開発では、ターミナル操作に慣れておくと非常に便利です。
エディタは、初心者ならVS Codeがおすすめです。軽量でLinux版があり、C#向け拡張機能を入れることでコード補完やデバッグが使いやすくなります。Microsoft公式のC#紹介ページでも、Visual Studio Code、Visual Studio、コマンドラインツールなど複数の開発スタイルが案内されています。
3-2. .NET SDKをインストールする
C#をLinuxで開発するには、まず.NET SDKをインストールします。インストール方法はディストリビューションによって変わるため、実際のコマンドは公式ドキュメントで自分のLinuxに合ったものを確認するのが確実です。
UbuntuやDebian系では、概念的には次のような流れです。
Bashsudo apt update
sudo apt install dotnet-sdk-<バージョン>
Fedora系では、次のようにdnfを使う場合があります。
Bashsudo dnf install dotnet-sdk-<バージョン>
Snapを使う方法もあります。Snap版の.NET SDKはCanonicalによって提供・管理されており、.NET 9以降ではバージョン別のパッケージ名が使われるようになっています。たとえば.NET 10 SDKの例としてdotnet-sdk-100という形式が案内されています。
Bashsudo snap install dotnet-sdk-100 --classic
ただし、Linuxではディストリビューション側のリポジトリとMicrosoftのリポジトリが混在すると、dotnet関連のエラーが起きることがあります。公式ドキュメントでも、複数のパッケージソースから.NETを混在させると問題が起きやすいと説明されています。
初心者は、次の方針がおすすめです。
Ubuntu公式パッケージで入れるなら、それに統一する
Microsoftリポジトリで入れるなら、それに統一する
Snapで入れるなら、Snap版として管理する
複数の方法を混ぜない
3-3. dotnetコマンドでインストール確認をする
.NET SDKをインストールしたら、ターミナルで次のコマンドを実行します。
Bashdotnet --version
バージョン番号が表示されれば、SDKが使える状態です。
より詳しい情報を確認したい場合は、次のコマンドを使います。
Bashdotnet --info
このコマンドでは、インストール済みのSDK、ランタイム、OS情報、アーキテクチャなどを確認できます。Microsoftのトラブルシューティングでも、インストール済みSDKやランタイムを確認する方法としてdotnet --infoが案内されています。
正常に入っていれば、次のような情報が表示されます。
.NET SDK:
Version: 10.0.xxx
Runtime Environment:
OS Name: ubuntu
OS Platform: Linux
RID: linux-x64
もしdotnet: command not foundと表示される場合は、インストールに失敗しているか、PATHが通っていない可能性があります。この場合は、後述するトラブルシューティングを確認してください。
3-4. VS CodeとC#拡張機能を導入する
ターミナルだけでもC#開発はできますが、初心者にはVS Codeを使った開発をおすすめします。VS Codeを使うと、コード補完、定義ジャンプ、エラー表示、デバッグなどが使いやすくなります。
基本的な流れは次のとおりです。
VS Codeをインストールする
C#関連の拡張機能を入れる
作成したC#プロジェクトのフォルダを開く
ターミナルとエディタを併用して開発する
VS CodeでC#開発をする場合は、C# Dev KitやC#拡張機能を導入すると便利です。プロジェクトを開くと、エディタが.csprojやProgram.csを認識し、補完やエラー表示を行ってくれます。
LinuxではVisual Studio本体ではなく、VS Codeとdotnetコマンドを組み合わせる構成が使いやすいです。軽量で、サーバー開発やDocker開発にも向いています。
3-5. 初心者におすすめの開発環境構成
初心者におすすめのC# Linux開発環境は、次の構成です。
OS:Ubuntu Desktop または Ubuntu Server
SDK:最新の安定版.NET SDK
エディタ:VS Code
拡張機能:C# Dev KitまたはC#関連拡張
バージョン管理:Git
コンテナ:Docker
学習段階では、まずUbuntu Desktopに.NET SDKとVS Codeを入れ、コンソールアプリを作るところから始めるとよいでしょう。その後、ASP.NET Core、Docker、Linuxサーバーへのデプロイへ進むと、自然に実務寄りのスキルが身につきます。
サーバー運用を学びたい人は、Ubuntu ServerやDebianを仮想マシンで用意し、SSHで接続してC#アプリを動かす練習をすると効果的です。
4. LinuxでC#プログラムを作成・実行する方法
4-1. dotnet newでC#プロジェクトを作成する
.NET SDKをインストールしたら、実際にC#プロジェクトを作成してみましょう。まずはコンソールアプリがおすすめです。
Bashdotnet new console -o HelloLinux
このコマンドは、HelloLinuxというフォルダを作り、その中にC#のコンソールアプリ用プロジェクトを生成します。
作成されたフォルダに移動します。
Bashcd HelloLinux
中身を確認すると、次のようなファイルがあります。
Bashls
HelloLinux.csproj
Program.cs
HelloLinux.csprojはプロジェクト設定ファイル、Program.csはC#のコードを書くファイルです。
dotnetコマンドは、.NETプロジェクトを操作するためのコマンドを提供し、dotnet buildなどのサブコマンドを使ってビルドや実行を行えます。
4-2. Program.csを編集してHello Worldを表示する
Program.csを開くと、最初から簡単なコードが書かれていることがあります。たとえば次のような内容です。
C#Console.WriteLine("Hello, World!");
これをLinuxで実行していることがわかるように、次のように変更してみましょう。
C#Console.WriteLine("Hello, C# on Linux!");
C#では、Console.WriteLine()を使うとターミナルに文字列を表示できます。初心者が最初に覚えるべき基本の1つです。
もう少しC#らしく変数を使うなら、次のように書けます。
C#string os = "Linux";
Console.WriteLine($"Hello, C# on {os}!");
$"..."は文字列補間と呼ばれる書き方で、文字列の中に変数を埋め込めます。
4-3. dotnet runでC#アプリを実行する
プログラムを書いたら、次のコマンドで実行します。
Bashdotnet run
ターミナルに次のように表示されれば成功です。
Hello, C# on Linux!
dotnet runは、プロジェクトをビルドしてから実行するコマンドです。学習中や開発中は頻繁に使います。
たとえば、コードを変更したら再び次のコマンドを実行します。
Bashdotnet run
これだけで、変更後のプログラムを確認できます。
4-4. dotnet buildでビルドする
アプリを実行せず、ビルドだけ行いたい場合は次のコマンドを使います。
Bashdotnet build
ビルドが成功すると、binフォルダの中にビルド結果が作成されます。
bin/
obj/
ビルド時に文法エラーがあると、ターミナルにエラーメッセージが表示されます。たとえばセミコロンを忘れると、どのファイルの何行目に問題があるかが表示されます。
LinuxでC#を学ぶときは、エラーメッセージを読む習慣がとても大切です。最初は英語のエラーに戸惑うかもしれませんが、ファイル名、行番号、エラー内容を順番に見れば原因を特定しやすくなります。
4-5. dotnet testでテストを実行する
C#では、テストプロジェクトを作って自動テストを実行できます。たとえばxUnitを使う場合、次のようにテストプロジェクトを作成できます。
Bashdotnet new xunit -o HelloLinux.Tests
実務では、アプリ本体のプロジェクトとテストプロジェクトを分けて管理することが多いです。テストを実行するには、テストプロジェクトのフォルダで次のコマンドを使います。
Bashdotnet test
テストが成功すると、成功件数や実行時間が表示されます。Linux上でもテストは問題なく実行できます。
初心者のうちは、まず簡単なメソッドを作り、それに対してテストを書く練習をするとよいでしょう。C#は静的型付け言語なので、ビルド時のチェックと自動テストを組み合わせることで、安定したプログラムを作りやすくなります。
5. LinuxでC#をデバッグ・開発しやすくする方法
5-1. VS CodeでC#コードを補完する
LinuxでC#を書くとき、VS Codeを使うとコード補完が使えて便利です。たとえばConsole.と入力すると、WriteLineなどの候補が表示されます。
補完が効かない場合は、次の点を確認してください。
.NET SDKが正しくインストールされているか
VS Codeでプロジェクトのフォルダを開いているか
C#拡張機能が有効になっているか
.csprojファイルが存在しているか
単体の.csファイルだけを開くより、.csprojがあるプロジェクトフォルダ全体をVS Codeで開く方が、補完や解析が正しく動きやすくなります。
また、Linuxではファイル名の大文字・小文字が区別されます。Program.csとprogram.csは別ファイルとして扱われるため、プロジェクト内のファイル名にも注意しましょう。
5-2. ブレークポイントを使ってデバッグする
VS Codeを使うと、ブレークポイントを設定してC#プログラムを途中で止めながら確認できます。
たとえば次のようなコードがあるとします。
C#int a = 10;
int b = 20;
int sum = a + b;
Console.WriteLine(sum);
int sum = a + b;の行にブレークポイントを置いて実行すると、その行で処理を一時停止できます。停止中は、変数aやbの値を確認できます。
デバッグでは次の操作をよく使います。
ブレークポイント:指定した行で止める
ステップオーバー:次の行へ進む
ステップイン:メソッドの中に入る
変数表示:現在の値を確認する
ウォッチ:特定の式や変数を監視する
初心者は、エラーが出たときだけでなく、「この変数には今何が入っているのか」を確認する目的でデバッグを使うと理解が深まります。
5-3. NuGetパッケージを追加する
C#では、外部ライブラリをNuGetパッケージとして追加できます。たとえばJSON処理、ログ出力、データベース接続、テストなど、多くの便利なパッケージがあります。
パッケージを追加するには、次のようにdotnet add packageを使います。
Bashdotnet add package Newtonsoft.Json
追加後、.csprojにパッケージ参照が追加されます。
XML<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="..." />
</ItemGroup>
パッケージを復元するには、通常はビルドや実行時に自動で行われますが、明示的に行うなら次のコマンドを使います。
Bashdotnet restore
NuGetパッケージの復元に失敗する場合は、ネットワーク、プロキシ、証明書、パッケージソースの設定などを確認します。
5-4. Gitと組み合わせて開発する
LinuxでC#を開発するなら、Gitも一緒に使うのがおすすめです。Gitを使うと、変更履歴を管理でき、失敗した変更を戻したり、GitHubなどにコードを保存したりできます。
まず、プロジェクトフォルダでGitを初期化します。
Bashgit init
.NETプロジェクトでは、binやobjなどのビルド生成物はGit管理に含めないのが一般的です。.gitignoreを作成するには、次のコマンドが便利です。
Bashdotnet new gitignore
その後、ファイルを追加してコミットします。
Bashgit add .
git commit -m "Initial commit"
C#、Linux、Gitを組み合わせて使えるようになると、個人開発だけでなくチーム開発にも対応しやすくなります。
5-5. よく使うdotnetコマンド一覧
LinuxでC#開発をするときによく使うdotnetコマンドをまとめます。
| コマンド | 用途 |
|---|---|
dotnet --version | SDKのバージョン確認 |
dotnet --info | SDK・ランタイム・OS情報の確認 |
dotnet new console | コンソールアプリ作成 |
dotnet new webapi | Web APIプロジェクト作成 |
dotnet restore | NuGetパッケージ復元 |
dotnet build | ビルド |
dotnet run | 実行 |
dotnet test | テスト実行 |
dotnet add package | NuGetパッケージ追加 |
dotnet publish | 公開用ファイル作成 |
初心者は、まずnew、run、build、test、publishを覚えれば十分です。慣れてきたら、ソリューション管理やパッケージ管理のコマンドも使っていきましょう。
6. LinuxでC#アプリを公開・デプロイする方法
6-1. dotnet publishで公開用ファイルを作成する
開発中はdotnet runで実行できますが、本番環境に配置する場合はdotnet publishを使って公開用ファイルを作成します。
基本コマンドは次のとおりです。
Bashdotnet publish -c Release -o publish
このコマンドでは、Release構成でビルドし、publishフォルダに公開用ファイルを出力します。
Microsoft公式ドキュメントでも、dotnet publishはアプリをコンパイルし、依存関係を読み取り、公開用のファイル一式をディレクトリに出力するコマンドとして説明されています。
作成されたpublishフォルダをサーバーにコピーすれば、Linuxサーバー上で実行できます。
Bashscp -r publish user@example.com:/var/www/myapp
コンソールアプリなら、サーバー側で次のように実行します。
Bashdotnet MyApp.dll
6-2. フレームワーク依存デプロイと自己完結型デプロイの違い
.NETアプリのデプロイ方式には、大きく分けて「フレームワーク依存デプロイ」と「自己完結型デプロイ」があります。
フレームワーク依存デプロイは、サーバー側に.NETランタイムがインストールされている前提でアプリを配置する方法です。公開ファイルのサイズが小さく、複数のアプリでランタイムを共有できます。
自己完結型デプロイは、アプリと一緒に.NETランタイムも含めて配布する方法です。サーバーに.NETランタイムを事前インストールしなくても動かしやすい反面、ファイルサイズは大きくなります。
Microsoftのデプロイ関連ドキュメントでも、発行時にフレームワーク依存または自己完結型のデプロイモードを選べることが説明されています。
例として、Linux x64向けに自己完結型で発行する場合は次のようにします。
Bashdotnet publish -c Release -r linux-x64 --self-contained true -o publish
一方、フレームワーク依存で発行する場合は次のようにします。
Bashdotnet publish -c Release --self-contained false -o publish
初心者は、まずフレームワーク依存デプロイを理解し、その後に自己完結型デプロイを試すとよいでしょう。
6-3. LinuxサーバーでC#アプリを実行する
LinuxサーバーでC#アプリを実行する基本手順は次のとおりです。
サーバーに.NETランタイムまたはSDKを入れる
アプリをdotnet publishする
公開ファイルをサーバーにコピーする
dotnet アプリ名.dllで実行する
必要に応じてポートや環境変数を設定する
ASP.NET CoreのWebアプリを実行する場合は、たとえば次のようにします。
Bashdotnet MyWebApp.dll
アプリがhttp://localhost:5000などで起動したら、Nginxをリバースプロキシとして前段に置く構成がよく使われます。公式ドキュメントでも、Nginxをリバースプロキシとして使い、Kestrelにリクエストを転送する構成が紹介されています。
本番運用では、直接ターミナルで起動するだけでは不十分です。SSH接続を切るとプロセスが終了することがあるため、次のような方法で常駐化します。
systemdでサービス化する
Dockerコンテナとして起動する
クラウドのアプリ実行基盤を使う
6-4. systemdでC#アプリを常駐化する
LinuxサーバーでC#アプリを常時起動させるには、systemdを使う方法が一般的です。systemdにサービスとして登録すると、サーバー起動時に自動起動したり、異常終了時に再起動したりできます。
例として、/etc/systemd/system/myapp.serviceを作成します。
INI[Unit]
Description=My C# App on Linux
After=network.target
[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dll
Restart=always
RestartSec=10
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
作成後、次のコマンドで有効化・起動します。
Bashsudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
状態確認は次のコマンドです。
Bashsudo systemctl status myapp
ログを見るには次のようにします。
Bashjournalctl -u myapp -f
ASP.NET CoreをLinuxで本番運用する公式ガイドでも、アプリを起動時にデーモンとして実行し、プロセス管理ツールで再起動できるようにする構成が説明されています。
6-5. Dockerを使ってC#アプリをデプロイする
LinuxでC#アプリを動かすなら、Dockerも非常に相性が良いです。Dockerを使うと、アプリと実行環境をコンテナとしてまとめられるため、開発環境と本番環境の差を小さくできます。
ASP.NET Coreアプリの簡単なDockerfile例は次のとおりです。
dockerfileFROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
WORKDIR /app
EXPOSE 8080
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyWebApp.dll"]
イメージをビルドします。
Bashdocker build -t mywebapp .
コンテナを起動します。
Bashdocker run -d -p 8080:8080 --name mywebapp mywebapp
.NETは公式のコンテナイメージも提供されており、Linux環境でのデプロイに活用できます。MicrosoftのLinuxインストールドキュメントでも、.NETはコンテナイメージとしても利用できると案内されています。
Dockerを使うと、ローカルのLinux環境、CI/CD、本番サーバー、クラウド環境で同じように動かしやすくなります。
6-6. クラウド環境にC#アプリをデプロイする選択肢
C#アプリはLinuxサーバーだけでなく、クラウドにもデプロイできます。代表的な選択肢は次のとおりです。
Azure App Service
Azure Container Apps
Azure Kubernetes Service
AWS Elastic Beanstalk
AWS ECS
AWS Lambda
Google Cloud Run
Google Kubernetes Engine
VPS上のLinuxサーバー
初心者が学ぶなら、まずは次の順番がおすすめです。
ローカルLinuxでdotnet run
↓
dotnet publishしてLinuxサーバーで実行
↓
systemdで常駐化
↓
Dockerでコンテナ化
↓
クラウドへデプロイ
最初からKubernetesのような複雑な環境に進むより、まずはLinuxサーバーでC#アプリがどのように動くのかを理解することが大切です。その後、Dockerやクラウドを使うと、仕組みを理解したうえで応用できます。
7. LinuxでC#を使うときの注意点
7-1. Windows FormsやWPFはLinuxでそのまま動かせるのか
Windows FormsやWPFで作られたC#アプリは、Linuxでそのまま動くとは限りません。むしろ、基本的にはWindows専用と考えるべきです。
.NET自体はクロスプラットフォームですが、Windows FormsやWPFはWindowsデスクトップ向けの技術です。Microsoft公式の移行ドキュメントでも、Windows FormsとWPFは.NETで利用できるものの、Windows専用技術であると説明されています。
LinuxでGUIアプリを作りたい場合は、次のようなクロスプラットフォーム対応のUIフレームワークを検討します。
Avalonia UI
Uno Platform
MAUIの対応状況を確認する
Webアプリとして作る
ElectronやWeb技術と組み合わせる
初心者には、Linux GUIアプリよりも、まずはWebアプリやWeb APIとして作る方法がおすすめです。ブラウザで画面を表示する構成なら、Linuxサーバーでも扱いやすく、デプロイもしやすいです。
7-2. ファイルパスや改行コードの違いに注意する
WindowsとLinuxでは、ファイルパスの表記が異なります。
Windowsでは次のようなパスを使います。
C:\Users\user\Documents\file.txt
Linuxでは次のようなパスになります。
/home/user/documents/file.txt
C#でパスを扱うときに、文字列で直接/や\を書きすぎると、OS差分で問題が起きることがあります。できるだけPath.Combineを使いましょう。
C#string path = Path.Combine("data", "input.txt");
また、改行コードも異なります。WindowsではCRLF、LinuxではLFが一般的です。C#で環境に応じた改行を使うなら、Environment.NewLineを使う方法があります。
C#string text = "Hello" + Environment.NewLine + "Linux";
ただし、Web APIやJSONでは改行コードを意識しなくてよい場面も多いため、ファイル出力やテキスト処理をするときに注意すれば十分です。
7-3. 大文字・小文字を区別するLinuxファイルシステム
Linuxのファイルシステムでは、通常、大文字・小文字が区別されます。
たとえば、次の2つは別ファイルとして扱われます。
Config.json
config.json
Windowsでは区別されないことが多いため、Windowsで作ったC#アプリをLinuxに持ってくると、ファイル名の違いでエラーになることがあります。
よくある例は次のとおりです。
C#File.ReadAllText("config.json");
実際のファイル名がConfig.jsonだと、Linuxでは見つからない可能性があります。
対策として、次のルールを決めておくと安全です。
ファイル名は小文字に統一する
参照する名前と実ファイル名を完全に一致させる
Git上でもファイル名変更を明確に管理する
設定ファイル名の表記ゆれを避ける
7-4. ネイティブライブラリ依存によるエラー
C#のライブラリの中には、内部でOS固有のネイティブライブラリに依存しているものがあります。Windowsでは動いたのにLinuxでは動かない場合、ネイティブ依存が原因になっていることがあります。
たとえば、画像処理、PDF処理、暗号化、圧縮、データベースドライバなどで発生することがあります。
よくあるエラーの例は次のようなものです。
Unable to load shared library
DllNotFoundException
libxxx.so not found
Linuxでは、共有ライブラリは.soファイルとして扱われます。必要なライブラリがOSに入っていない場合は、aptやdnfで追加インストールが必要です。
対策は次のとおりです。
利用ライブラリがLinux対応か確認する
必要なネイティブ依存をインストールする
Dockerfileに依存パッケージのインストールを含める
linux-x64など適切なRIDでpublishする
.NETではLinux向けのRuntime Identifierとしてlinux-x64、Alpine Linux向けのlinux-musl-x64、Arm向けのlinux-arm64などが使われます。公式のRIDカタログでも、Linux向けのRIDが案内されています。
7-5. 権限・ポート・ファイアウォールの確認ポイント
LinuxサーバーでC#アプリを動かすときは、権限やポートにも注意が必要です。
たとえば、アプリがファイルを書き込む場合、そのディレクトリに書き込み権限が必要です。
Bashsudo chown -R www-data:www-data /var/www/myapp
また、Webアプリを公開する場合は、ポートが開いている必要があります。
Bashsudo ss -tuln
ファイアウォールを使っている場合は、必要なポートを許可します。
Bashsudo ufw allow 80
sudo ufw allow 443
ASP.NET Coreアプリを直接80番ポートで起動しようとすると、権限の問題が出ることがあります。本番環境では、アプリは通常のユーザーで高くないポート番号で動かし、NginxやApacheを前段に置いて80番・443番を受ける構成がよく使われます。
8. LinuxでC#が動かないときのトラブルシューティング
8-1. dotnetコマンドが見つからない場合
dotnetコマンドを実行して次のように表示される場合があります。
dotnet: command not found
この場合、主な原因は次のいずれかです。
.NET SDKがインストールされていない
PATHが通っていない
Snapのaliasが作成されていない
インストール後にターミナルを開き直していない
まずはインストール状態を確認します。
Bashwhich dotnet
何も表示されない場合は、dotnetコマンドが見つかっていません。
Snapでインストールした場合、aliasが必要になることがあります。MicrosoftのSnap向けドキュメントでも、dotnetコマンドのaliasが作成されていない場合に手動でaliasを設定する方法が案内されています。
Bashsudo snap alias dotnet-sdk-100.dotnet dotnet
パッケージマネージャーで入れた場合は、インストール手順を再確認し、ターミナルを開き直してください。
8-2. SDKとランタイムのバージョンが合わない場合
C#アプリをビルド・実行するときに、SDKやランタイムのバージョンが合わないとエラーになることがあります。
まずは次のコマンドで状態を確認します。
Bashdotnet --info
確認すべきポイントは次のとおりです。
インストール済みSDKのバージョン
インストール済みランタイムのバージョン
プロジェクトのTargetFramework
global.jsonの指定
.csprojには、対象フレームワークが書かれています。
XML<TargetFramework>net10.0</TargetFramework>
もしプロジェクトがnet10.0を対象にしているのに、サーバーには対応するランタイムがない場合、実行できません。
対策は次のいずれかです。
サーバーに必要な.NETランタイムを入れる
プロジェクトのTargetFrameworkを環境に合わせる
自己完結型デプロイでランタイムごと配布する
global.jsonのSDK指定を見直す
8-3. NuGetパッケージの復元に失敗する場合
dotnet restoreやdotnet buildでNuGetパッケージの復元に失敗することがあります。
よくある原因は次のとおりです。
インターネットに接続できない
プロキシ設定が必要
NuGet.orgにアクセスできない
社内ネットワークで証明書エラーが起きている
パッケージソース設定が壊れている
まず、次のコマンドを試します。
Bashdotnet restore
それでも失敗する場合は、NuGetソースを確認します。
Bashdotnet nuget list source
NuGet.orgが無効になっている場合は、有効化や再追加が必要です。
Bashdotnet nuget enable source nuget.org
企業ネットワークでは、プロキシや証明書が原因になることもあります。この場合は、OS側の証明書設定やNuGet設定を確認します。
8-4. 実行権限エラーが出る場合
LinuxでC#アプリを実行するときに、権限エラーが出ることがあります。
たとえば、自己完結型デプロイで生成した実行ファイルを直接起動する場合、実行権限が必要です。
Bashchmod +x MyApp
./MyApp
ファイル書き込みでエラーになる場合は、アプリを実行しているユーザーに書き込み権限があるか確認します。
Bashls -la
systemdで実行している場合、サービスファイルのUser=で指定したユーザーの権限が使われます。ターミナルでは動くのにsystemdでは動かない場合、実行ユーザーや作業ディレクトリが違うことがあります。
確認するポイントは次のとおりです。
WorkingDirectoryが正しいか
ExecStartのパスが正しいか
実行ユーザーに権限があるか
環境変数が設定されているか
ファイルやディレクトリの所有者が正しいか
8-5. デプロイ後にアプリが起動しない場合
LinuxサーバーにデプロイしたC#アプリが起動しない場合は、順番に原因を切り分けます。
まず、手動で実行します。
Bashcd /var/www/myapp
dotnet MyApp.dll
ここでエラーが出るなら、アプリ本体、ランタイム、設定ファイル、依存ライブラリに問題があります。
次に、systemdのログを確認します。
Bashsudo systemctl status myapp
journalctl -u myapp -n 100
ポートの競合も確認します。
Bashsudo ss -tuln
設定ファイルが読み込めているかも重要です。ASP.NET Coreでは、appsettings.jsonや環境変数、ASPNETCORE_ENVIRONMENTの違いで動作が変わります。
よくある原因は次のとおりです。
.NETランタイムが入っていない
TargetFrameworkとランタイムが合っていない
appsettings.jsonがコピーされていない
ポートが使用中
権限がない
systemdのWorkingDirectoryが間違っている
ネイティブライブラリが不足している
ファイアウォールで外部からアクセスできない
焦らず、手動実行、ログ確認、ポート確認、権限確認の順番で見ていくと、原因を見つけやすくなります。
9. LinuxでC#を学ぶ初心者におすすめの学習ステップ
9-1. まずはコンソールアプリで基本文法を学ぶ
初心者は、まずコンソールアプリでC#の基本文法を学ぶのがおすすめです。GUIやWebアプリから始めると覚えることが多く、C#そのものに集中しにくくなります。
最初に学ぶべき内容は次のとおりです。
変数
型
条件分岐
繰り返し
配列
List
メソッド
クラス
例外処理
ファイル入出力
LINQ
非同期処理の基礎
たとえば、簡単な計算アプリやメモ保存ツールを作るだけでも、C#の基本をかなり学べます。
C#Console.Write("名前を入力してください: ");
string? name = Console.ReadLine();
Console.WriteLine($"こんにちは、{name}さん!");
Linuxのターミナルで動く小さなプログラムを何度も作ることで、dotnet new、dotnet run、dotnet buildにも自然に慣れていきます。
9-2. 次にWeb APIやASP.NET Coreに進む
C#の基本文法に慣れたら、次はASP.NET CoreでWeb APIを作るのがおすすめです。LinuxでC#を使う実務的な場面では、Web APIやバックエンド開発が非常に多いからです。
Web APIプロジェクトは次のように作成できます。
Bashdotnet new webapi -o MyApi
cd MyApi
dotnet run
起動後、ブラウザやcurlでAPIにアクセスできます。
Bashcurl http://localhost:5000
Web APIでは、次のような内容を学べます。
HTTP
ルーティング
ControllerまたはMinimal API
JSON
依存性注入
設定ファイル
ログ
データベース接続
認証・認可
ASP.NET CoreはLinuxサーバーとの相性も良く、NginxやDockerと組み合わせた運用にも進みやすいです。
9-3. DockerやLinuxサーバー運用を学ぶ
C#アプリを作れるようになったら、DockerやLinuxサーバー運用も学びましょう。LinuxでC#を使うメリットは、開発だけでなくデプロイや運用まで一貫して学べることです。
学習するとよい内容は次のとおりです。
SSH接続
ファイル転送
systemd
Nginx
ファイアウォール
環境変数
ログ確認
Dockerfile
docker compose
CI/CD
たとえば、ASP.NET CoreアプリをDocker化し、Linuxサーバーで起動する練習をすると、実務に近い経験になります。
Bashdocker build -t myapi .
docker run -d -p 8080:8080 myapi
その後、Nginxでリバースプロキシを設定し、HTTPS化まで行うと、かなり実践的なスキルになります。
9-4. ポートフォリオに使いやすいC#アプリ例
LinuxでC#を学ぶなら、ポートフォリオとして見せやすいアプリを作るのもおすすめです。
例としては、次のようなものがあります。
タスク管理API
家計簿API
ブログAPI
在庫管理システム
ファイル整理CLIツール
ログ解析ツール
天気情報取得アプリ
Discord Bot
定期実行バッチ
Docker化したWeb API
初心者に特におすすめなのは、Web APIとDockerを組み合わせたポートフォリオです。
構成例は次のとおりです。
C# / ASP.NET Core
PostgreSQL
Entity Framework Core
Docker Compose
GitHub Actions
Linuxサーバーまたはクラウドにデプロイ
この構成を作れるようになると、C#、Linux、データベース、Docker、デプロイの基本をまとめてアピールできます。
9-5. LinuxでC#を学ぶときに参考になる公式情報
LinuxでC#を学ぶときは、古い記事だけでなく公式情報も確認することが大切です。.NETはバージョン更新があり、インストール方法や推奨構成が変わることがあるためです。
特に確認したい公式情報は次のとおりです。
.NET公式サイト
Microsoft LearnのC#ドキュメント
Microsoft Learnの.NETインストールドキュメント
ASP.NET Coreのホスト・デプロイドキュメント
.NET CLIコマンドのドキュメント
.NETコンテナイメージの情報
Microsoft LearnのC#ガイドには、C#と.NETを始めるためのドキュメント、チュートリアル、コードサンプルがまとまっています。
また、Linuxへの.NETインストールについては、ディストリビューションごとの公式手順を確認するのが安全です。
10. LinuxとC#に関するよくある質問
10-1. LinuxだけでC#開発は完結できる?
はい、LinuxだけでC#開発は完結できます。.NET SDK、VS Code、Git、Dockerなどを使えば、プロジェクト作成、コーディング、ビルド、テスト、実行、デプロイまでLinux上で行えます。
特にコンソールアプリ、Web API、ASP.NET Coreアプリ、バッチ処理、バックグラウンドサービスであれば、Linuxだけでも十分に開発できます。
ただし、Windows FormsやWPFなどのWindows専用デスクトップアプリを作る場合は、Windows環境が必要です。LinuxでC#を使うなら、クロスプラットフォーム対応の技術を選ぶことが大切です。
10-2. Visual StudioはLinuxで使える?
Visual Studio本体は、基本的にLinux向けには提供されていません。LinuxでC#開発をする場合は、VS Code、JetBrains Rider、Vim、Neovimなどを使うのが一般的です。
初心者にはVS Codeがおすすめです。軽量でLinux版があり、C#向け拡張機能を入れることで補完やデバッグが使えます。
Visual Studioのような統合開発環境に近い体験を求める場合は、JetBrains Riderも選択肢になります。ただし有料プランが関係するため、まずはVS Codeとdotnetコマンドで始めるのがよいでしょう。
10-3. C#はLinuxサーバー運用に向いている?
C#はLinuxサーバー運用に向いています。特にASP.NET Coreは、Web APIやバックエンドサービスを作る用途でよく使われます。
LinuxサーバーでC#を使うメリットは次のとおりです。
高性能なWeb APIを作れる
Docker化しやすい
systemdで常駐化できる
Nginxと組み合わせやすい
クラウドにデプロイしやすい
静的型付けで保守しやすい
一方で、Linuxの基本操作、ログ確認、権限、ポート、ファイアウォールなどの知識は必要です。C#だけでなく、Linuxサーバー運用の基礎も一緒に学ぶと実務で役立ちます。
10-4. C#でLinuxのGUIアプリは作れる?
作れますが、Windows FormsやWPFをそのまま使うのではなく、Linux対応のGUIフレームワークを選ぶ必要があります。
候補としては、Avalonia UIやUno Platformなどがあります。また、GUIをネイティブアプリとして作るのではなく、ASP.NET CoreでWebアプリとして作り、ブラウザから操作する構成も現実的です。
初心者には、Linux GUIアプリよりもWebアプリの方がおすすめです。Webアプリなら、Linuxサーバーで動かして、Windows、macOS、スマートフォンなどのブラウザから利用できます。
10-5. Windowsで作ったC#アプリをLinuxで動かせる?
アプリの作り方によります。
次のようなアプリは、Linuxで動かせる可能性が高いです。
.NETで作ったコンソールアプリ
ASP.NET Coreアプリ
クロスプラットフォーム対応ライブラリだけを使ったアプリ
OS依存処理が少ないアプリ
一方で、次のようなアプリはそのままでは難しい場合があります。
.NET Framework専用アプリ
Windows Formsアプリ
WPFアプリ
レジストリに依存するアプリ
Windows固有APIを使うアプリ
Windowsパス前提のアプリ
移植する場合は、まず.csprojのTargetFramework、利用ライブラリ、ファイルパス、OS固有API、GUI技術を確認しましょう。
10-6. 初心者はLinuxとWindowsのどちらでC#を始めるべき?
目的によって選ぶのがおすすめです。
Windowsデスクトップアプリを作りたいなら、Windowsで始める方が学びやすいです。Visual Studio、Windows Forms、WPFなどを使う場合は、Windows環境が自然です。
一方で、Web API、サーバーサイド開発、Docker、クラウド、Linuxサーバー運用に興味があるなら、LinuxでC#を始める価値は大きいです。
初心者におすすめの選び方は次のとおりです。
Web APIを作りたい → LinuxでもOK
サーバー運用を学びたい → Linuxがおすすめ
Dockerを使いたい → Linuxがおすすめ
Windowsデスクトップアプリを作りたい → Windowsがおすすめ
C#文法だけ学びたい → どちらでもOK
最終的には、WindowsでもLinuxでもC#の基本文法は同じです。大切なのは、自分が作りたいアプリに合った環境を選ぶことです。
まとめ
C#はLinuxでも十分に使えます。現在の.NETはクロスプラットフォーム対応しており、Linux上でC#コードを書き、ビルドし、実行し、サーバーやDocker、クラウドへデプロイできます。
LinuxでC#を始める基本の流れは次のとおりです。
Linux環境を用意する
.NET SDKをインストールする
dotnet --infoで確認する
dotnet newでプロジェクトを作る
Program.csを編集する
dotnet runで実行する
dotnet buildでビルドする
dotnet publishで公開する
必要に応じてsystemdやDockerで運用する
ただし、Windows FormsやWPFのようなWindows専用技術は、Linuxではそのまま使えない点に注意が必要です。LinuxでC#を使うなら、コンソールアプリ、ASP.NET Core、Web API、バックグラウンドサービス、Dockerアプリなどから始めるのがおすすめです。
初心者は、まずコンソールアプリでC#の文法を学び、次にASP.NET CoreでWeb APIを作り、その後DockerやLinuxサーバーへのデプロイに進むとよいでしょう。C#とLinuxを組み合わせて学ぶことで、開発から運用まで対応できる実践的なスキルを身につけられます。

