Copyright (C) 2025 Takym.
概要
この記事では、「.NET SDK」に付属している dotnet
コマンドの使い方を重要な機能に絞って解説します。C# と Visual Studio Code でソフトウェア開発を行うには、必ず dotnet
コマンドを使う事になります。プログラムの実行に欠かせないツールとなっています。尚、.NET は 9.0 以上のバージョンを想定しており、過去のバージョンでの動作は保証しません。また、OS は Windows 10 以降を想定しております。
用語
解説に入る前に、各用語を簡易的に説明します。一部は長文になってしまいましたが、それでも厳密な説明ではないという事に注意してください。詳細且つ厳密な定義は辞書や辞典、参考書などをご自身でご検索ください。ここで説明していない用語についても、分からなければ、ご自身でお調べください。用語の意味が理解できる方は読み飛ばしても構いません。
- 機械語
- この記事においては「コンピュータが直接実行できる言語」と理解できていれば充分です。
- プログラミング言語
- 厳密には正しくありませんが、簡単に「人間が理解し易い形でプログラムを開発する為の言語」とお考えください。
- その目的を実現できずに難解な文法になっている場合も確かにありますし、習得しなければ扱うのは難しいです。習得すれば簡単に感じられるでしょう。怖気付く必要はありません。
- ソースコード
- プログラミング言語で書かれた文章・文字の羅列の事を言います。
- 「ソース」(Source)は情報源を意味します。コンピュータにとってソースコードは実行すべきプログラムの情報源にあたるのです。逆に機械語の事は翻訳対象(Target、ターゲット)と捉えられる事もあります。
- 「コード」(Code)は暗号や信号、規則、体系的な符号などの意味合いがあります。
- コンパイラ言語
- ソースコードを機械語に変換し、そのデータを実行可能ファイルに保存し、実行可能ファイルを実行する形式です。
- 実行可能ファイルとは、機械語を含んでいるファイルの事です。
- Windows であれば拡張子は「
*.exe
」になります。
- Windows であれば拡張子は「
- この機械語に変換するプログラムの事をコンパイラと呼びます。
- 実行可能ファイルとは、機械語を含んでいるファイルの事です。
- 実行可能ファイルではなくライブラリに変換される事もあります。
- ライブラリは、プログラムの図書館であり、他のプログラムから呼び出される事を前提としています。
- この前提の為、ライブラリファイルは直接起動する事ができません。
- この仕組みを使って同じプログラムを別のプログラムから再利用する事ができます。
- ライブラリの参照には静的リンクと動的リンクの二つの方式があります。
- 静的リンクは、コンパイル時にプログラムが結合されます。
- 動的リンクより速くなる場合もありますが、プログラムの容量が大きくなってしまいます。
- また、知的財産権の取り扱いがやや複雑になります。
- 動的リンクは、実行時に OS によってプログラムが結合されます。
- ライブラリの検索や読み込みなどに時間が掛かってしまう(現代的なコンピュータでは無視できるレベルです)ものの、部分的な更新や同じプログラムを重複して保持する必要が無いなどの利点があります。
- 静的リンクは、コンパイル時にプログラムが結合されます。
- .NET の場合は、拡張子は「
*.dll
」になり、動的リンクが主に使われております。実は Windows と同じ拡張子を用いています。
- 配布する時は、実行可能ファイルのみで良く、ソースコードを含める必要はありません。
- 後述する JIT 言語(Just in Time、実行時コンパイラ言語)との対比で、AOT 言語(Ahead of Time、事前コンパイラ言語)と呼ばれる事もあります。
- ソースコードを機械語に変換し、そのデータを実行可能ファイルに保存し、実行可能ファイルを実行する形式です。
- インタープリタ言語
- ソースコードを逐一機械語へ翻訳しながら実行する形式です。
- この翻訳から実行までを行うプログラムの事をインタープリタと呼びます。
- コンパイラ言語と比べて動作が遅くなりますが、コンパイルしてから起動するという手間がありません。
- また、インタープリタそのものを移植すれば、何れの環境でも実行する事ができます。
- スクリプト言語と呼ばれる事もあります。
- ソースコードを逐一機械語へ翻訳しながら実行する形式です。
- JIT 言語(Just in Time、実行時コンパイラ言語)
- コンパイラ言語とインタープリタ言語の良い所取りを行った様な仕組みです。
- まずは、ソースコードを中間言語に翻訳しておきます。
- 中間言語を用いない場合もあります。
- 実行時に中間言語を機械語に翻訳する点はインタープリタ言語と同じですが、その翻訳結果がキャッシュされ使い回されるという違いがあります。
- インタープリタ言語では同じソースコードが実行の度に翻訳されてしまい実行速度が低下していましたが、JIT 言語では翻訳は一度しか行われません。
- 通常のインタープリタ言語より速く動作させる事ができ、移植すれば何れの環境でも実行できるという強みがあります。
- ただし、最初の呼び出しには時間が掛かってしまいます。
- C# も JIT 言語の一つです。.NET ランタイムさえあれば何れの環境でも実行できます。
- リソース
- プログラムで用いられる関連ファイルやデータの事です。
- 簡単に実行時に必要なソースコード以外のファイルとお考えください。
- SDK(Software Development Kit、ソフトウェア開発キット)
- ソフトウェア開発に必要なツール類やライブラリをまとめたものです。
- コンパイラやインタープリタやランタイムやその他の色々な便利なツールが含まれています。
- .NET SDK には .NET ランタイムや C# コンパイラなどが含まれています。
dotnet
コマンドも .NET SDK に含まれているツールの一つです。 - IDE(Integrated Development Environment、統合開発環境)とは異なります。
- ソフトウェア開発に必要なツール類やライブラリをまとめたものです。
- プロジェクト
- 平たく説明すると一塊のプログラムの基本単位です。
- 一つのプログラムに必要なソースコード一式とリソース一式をまとめたものです。
- ワークスペースなどと呼称される場合もありますが、.NET ではプロジェクトと呼称するのが一般的です。
- Visual Studio では複数のプロジェクトをひとまとめにしたソリューションという概念もありますが、
dotnet
コマンドでは殆ど用いない為、ここでは説明を省きます。- 「Visual Studio」と「Visual Studio Code」は同一ブランドの異なる製品です。
ターミナルの開き方
dotnet
コマンドを呼び出すには、ターミナルを開く必要があります。
- Visual Studio Code の場合
- キーボードで
Ctrl + @
を押下してください。
- キーボードで
- コマンドプロンプトを開く場合
Win + R
を押下してください。- すると、「ファイル名を指定して実行」が開かれる筈です。
- 名前欄に「
cmd
」と入力し、エンターキーを押してください。
- エクスプローラから開く場合
- フォルダの何も無い所でシフトキーを押しながら右クリックしてください。デスクトップでも構いません。
- 「ターミナルで開く」や「コマンドプロンプト」や「PowerShell」を選んでください。
- Windows 11 の場合は「その他のオプションを確認」を選んでおく必要があるかもしれません。
- 何れを選んでも構いません。
- ターミナル内でディレクトリを移動するには
cd
コマンドを用います。
基本的な書式
dotnet
コマンドは次の書式で記述します:
> dotnet <サブコマンド> [引数...]
サブコマンドを指定する事で特定の機能を呼び出す事ができます。
説明書を表示するには次の様に入力します:
> dotnet /?
サブコマンドの説明書を表示する事もできます:
> dotnet <サブコマンド> /?
.NET に関する情報は次のコマンドで表示できます:
> dotnet --info
インストールされたランタイムの一覧は次のコマンドで表示できます:
> dotnet --list-runtimes
インストールされた SDK の一覧は次のコマンドで表示できます:
> dotnet --list-sdks
インストールされた .NET SDK のバージョンは次のコマンドで表示できます:
> dotnet --version
より詳細な説明は https://learn.microsoft.com/dotnet/core/tools/dotnet をご覧ください。
テンプレートからプロジェクトを生成(dotnet new
)
dotnet new
コマンドは、豊富なテンプレートからプロジェクトを生成するコマンドです。
コンソールアプリケーションを作成するには、次の様に入力します:
> dotnet new console
クラスライブラリを作成するには、console
の部分を classlib
に書き換えるだけです:
> dotnet new classlib
インストールされている全てのテンプレートの一覧を表示するには、次のコマンドを用いてください:
> dotnet new list
コマンド上では列「短い名前」にある名前を用います。
空ではないディレクトリをテンプレートで上書きする場合は、--force
オプションを付与します:
> dotnet new <テンプレート名> --force
より詳細な説明は https://learn.microsoft.com/dotnet/core/tools/dotnet-new をご覧ください。
プロジェクト設定とビルド構成
dotnet new console
を用いてプロジェクトを生成した場合、プロジェクトファイル(拡張子が「*.csproj
」のファイル)は以下の通りとなる筈です:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
プロジェクトファイルは XML で記述されています。
Project
要素にある Sdk
属性は使用する SDK を指定する為に使われます。殆どのプロジェクトでは Microsoft.NET.Sdk
が選ばれている事が多いです。他の一般的な SDK は https://learn.microsoft.com/dotnet/core/project-sdk/overview に記載されています。
PropertyGroup
要素ではプロジェクトのプロパティを設定します。OutputType
要素は出力ファイルの種類を指定します。既定ではコンソール画面付きの実行可能ファイルになっています。TargetFramework
要素は利用するフレームワークを指定します。既定では .NET 9.0 が選択されており、.NET SDK のバージョンと一致している事が確認できます。それ以外のプロパティに関する説明は今回は省きます。
.NET のプロジェクトファイル(より厳密には MSBuild)には、プロジェクト設定を切り替える機能があります。これをビルド構成と呼びます。既定では Debug
と Release
の二つが用意されています。改名する事もできますが、基本的には推奨されません。Debug
はプログラムが正しく動作するか試す為に使われます。最適化を行わなかったり、ソースコードとの対応関係を保持したり、試験時のみに呼び出せるコードを設定したりする事ができます。Release
はプログラムを利用者に配布する時に使います。最適化が掛かり、効率良く実行させる事ができます。ソースコードとの対応関係は保持されません。
特定のビルド構成でのみ有効にするには、Condition
属性内で Configuration
の値を判定します。例えば、PropertyGroup
要素に条件を加えるには次の様に記述します:
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<!-- Debug 構成で使用する設定 -->
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<!-- Release 構成で使用する設定 -->
</PropertyGroup>
プロジェクト設定とビルド構成に関する詳しい説明は次の説明書をご覧ください。
- https://learn.microsoft.com/visualstudio/msbuild/walkthrough-using-msbuild
- https://learn.microsoft.com/visualstudio/msbuild/msbuild-concepts
- https://learn.microsoft.com/visualstudio/msbuild/msbuild-reference
- https://learn.microsoft.com/dotnet/core/project-sdk/msbuild-props
- https://learn.microsoft.com/dotnet/csharp/language-reference/compiler-options
プロジェクトの復元(dotnet restore
)
プロジェクトが依存しているライブラリやツールなどの必要なファイルを所定のサーバーからダウンロードする時は、dotnet restore
コマンドを使います。通常は必要な時に自動的に実行される為、手動では呼び出さない場合が多いです。このブログでは、このコマンドで発生するエラーの事は復元時エラーなどと呼称する事にします。
次の様な単純な記述で呼び出せます:
> dotnet restore
プロジェクトファイルを明示的に指定する事もできます:
> dotnet restore Project.csproj
--force
オプションを付与する事で、復元し直す事ができます:
> dotnet restore --force
復元時エラーが発生した時に試してみると良いでしょう。それでもエラーが解決されない場合は、エラーメッセージをよくお読みください。
より詳細な説明は https://learn.microsoft.com/dotnet/core/tools/dotnet-restore をご覧ください。
プロジェクトの構築(dotnet build
)
dotnet build
コマンドは、プロジェクト設定に基づいてコンパイルやリンク、リソースの埋め込み、ソースコードの自動生成などを行って、実行可能ファイルを作ります。C# ではリンクはコンパイラが行います。このブログでは、このコマンドで発生するエラーの事は構築時エラーなどと呼称する事にします。通常は英語のままビルドエラーと呼ばれる事が多いです。構築時エラーには、コンパイル時エラーやリンク時エラーなどのエラーが含まれます。
何も設定を変更せずに構築(ビルド)する場合は、次の様に記述します:
> dotnet build
既定では Debug
構成となります。Release
構成を用いる場合は明示的に指定しなければなりません:
> dotnet build -c Release
フレームワークのバージョンを変更する事もできます:
> dotnet build -f net9.0
ただし、プロジェクト設定の修正も必要になります。
dotnet build
コマンドを呼び出すと、自動的に復元されますが、これを抑制する事もできます:
> dotnet build --no-restore
既に復元済みの場合は、ビルド時間を短縮できます。
dotnet restore
コマンドと同様に、プロジェクトファイルを明示的に指定する事もできます:
> dotnet build Project.csproj
これらの引数を組み合わせる事もできます:
> dotnet build Project.csproj -c Release -f net9.0 --no-restore
より詳細な説明は https://learn.microsoft.com/dotnet/core/tools/dotnet-build をご覧ください。
プロジェクトの実行(dotnet run
)
dotnet run
コマンドは、作成した実行可能ファイル(アプリケーション)を起動します。この時のエラーは実行時エラー(ランタイムエラー)などと呼ばれます。
何も引数を付けずに呼び出すと、既定の設定で、アプリケーションに引数を渡さずに起動できます:
> dotnet run
dotnet build
コマンドと同様に、ビルド構成やフレームワークを切り替える事ができます:
> dotnet build -c Release -f net9.0
dotnet run
コマンドを呼び出すと、自動的に構築されますが、これを抑制する事もできます:
> dotnet run --no-build
復元のみ抑制する場合は --no-restore
オプションを用います:
> dotnet run --no-restore
これらのオプションを用いると、起動までに掛かる時間を短縮する事ができます。また、--no-build
を指定する事で、ソースコードに加えた編集を反映させずにアプリケーションを起動するといった使い方もできます。
やはり dotnet run
コマンドでも、プロジェクトファイルを明示的に指定する事ができます:
> dotnet run Project.csproj
アプリケーションにコマンド行引数を渡すには、--
以降に引数を書きます:
> dotnet run -- arg0 arg2 arg3
「arg0 arg2 arg3
」がアプリケーションに渡される引数です。dotnet
コマンドの実行には影響を及ぼしません。
これらの引数を組み合わせる事もできます:
> dotnet run Project.csproj -c Release -f net9.0 --no-build -- hoge fuga piyo 123456 a1b2 "hello world"
より詳細な説明は https://learn.microsoft.com/dotnet/core/tools/dotnet-run をご覧ください。
プロジェクトの発行(dotnet publish
)
実行可能ファイルを配布できる形式に変換するには、dotnet restore
コマンドを使います。または、指定した場所へ配置する時にも使います。配布とは、実行可能ファイルを他者へ受け渡す事を意味します。頒布とも言います。販売する場合も含まれます。配置とは、サーバーや自分のコンピュータなど実運用環境へインストールする事を意味します。このブログでは、このコマンドで発生するエラーの事は発行時エラーなどと呼称する事にします。
何も引数を加えずに呼び出す事もできますが、ビルド構成に Debug
が使われてしまいやや不便です:
> dotnet publish
dotnet build
や dotnet run
コマンドと同様に、ビルド構成やフレームワークを切り替える事ができます:
> dotnet publish -c Release -f net9.0
例示はしませんが、--no-build
と --no-restore
も指定する事ができます。勿論、プロジェクトの明示的な指定も可能です。
より詳細な説明は https://learn.microsoft.com/dotnet/core/tools/dotnet-publish をご覧ください。
次に調べるべき事
お疲れ様でした。今回の解説はここまでとしますが、dotnet
コマンドにはまだたくさん機能があります。dotnet
コマンドの使い方が分かりましたら、次は MSBuild、Roslyn、NuGet などについて調べると良いでしょう。この記事で学んだコマンドの内部でどの様な動作が行われているか理解が深まると思います。最後までお読みいただきありがとうございました。