ある時、Windows 上で Visual Studio も VSCode の C# Dev Kit も使わずに C# のコンソールアプリケーションを作成およびビルドする必要が出てきました。その時、調べつつ実施したもののまとまった情報が見つからずに苦労したので、方法を備忘録としてメモしておきます。
以下の手順で環境を準備します。真っ新な環境でもできることを確認するために AWS の Windows EC2 インスタンスで実施することにします。また、メモ帳でコードを編集するのが少し煩わしく思ったので、VSCode もインストールします。
以下の手順でプロジェクトの作成とビルドを実施します。
1. 適当に場所にフォルダを作成して、VSCode でそのフォルダを開く。
2. ターミナルで dotnet new console --use-program-main
コマンドでプロジェクトを初期化する。
このコマンドを実行すると以下のようなフォルダとファイルが作成されます。以下はフォルダ csharp_console_simple の下で dotnet new console のコマンドを実施しました。
.
├── Program.cs
├── csharp_console_simple.csproj
└── obj
├── csharp_console_simple.csproj.nuget.dgspec.json
├── csharp_console_simple.csproj.nuget.g.props
├── csharp_console_simple.csproj.nuget.g.targets
├── project.assets.json
└── project.nuget.cache
2 directories, 7 files
3. ターゲットのフレームワークバージョンを変える場合は .csproj ファイルの TargetFramework を「net6.0」などに変更する。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
4. Program.cs を編集する。
ちなみに、dotnet new console のコマンド直後のファイルは以下です。
namespace csharp_console_simple;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
5. ターミナルで dotnet build --configuration Release
コマンドを実行する。ターゲットフレームワークを指定する場合は「–framework net6.0」といった形で指定する。)
6. ビルドにより生成された exe ファイルを実行する。
例えば .NET 8 をインストールして net6.0 を指定した場合は「You must install or update .NET to run this application.」といったエラーが発生します。ターゲットのバージョンをインストールできない場合などは、次の手順で生成された exe ファイルを実行します。
> .\bin\Release\net8.0\csharp_console_simple.exe
Hello, World!
7. ターミナルで dotnet publish --runtime win-x64 -o C:\path\to\output\folder
コマンドを実行する。
8. dotnet publish コマンドで生成された exe ファイルを実行する。
> C:\path\to\output\folder\csharp_console_simple.exe
Hello, World!
例えば以下のように dotnet add package コマンドを実行することで、ライブラリをインストールして .csproj に依存関係が記録されます。
dotnet add package log4net -v 2.0.17
NuGet でインストールできないライブラリをインストールするとき、そのライブラリの DLL をプロジェクト配下の適当なフォルダに配置して、.csproj ファイルの ItemGroup で指定します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Reference Include="xxxxx">
<HintPath>.\path\to\folder\xxxxx.dll</HintPath>
</Reference>
</ItemGroup>
</Project>