はじめに
第1弾・第2弾では、C++の開発環境をDevContainerで構築しました。
今回は同じ仕組みを使って C# + .NET 10 の開発環境を作ります。
.NET 10は2025年11月にリリースされたLTS(Long Term Support)版で、2028年まで3年間サポートされる現時点で最も安定した選択肢です。
この記事でできること
- .NET 10のC#開発環境をDevContainerで構築する
- クラスライブラリプロジェクトを作成する
- xUnitでユニットテストを書いて実行する
シリーズ構成
| 回 | 内容 |
|---|---|
| 第1弾 | 環境構築 → Hello World(C++) |
| 第2弾 | CMake + vcpkg で本格C++プロジェクト |
| 第3弾(本記事) | C# + .NET 10 + xUnit |
完成後のフォルダ構成
hello-csharp/
├── .devcontainer/
│ └── devcontainer.json
├── src/
│ └── MyLibrary/
│ ├── MyLibrary.csproj
│ └── Calculator.cs
├── tests/
│ └── MyLibrary.Tests/
│ ├── MyLibrary.Tests.csproj
│ └── CalculatorTests.cs
└── hello-csharp.sln
Step 1: devcontainer.jsonを作成する
.devcontainer/devcontainer.json を以下の内容で作成します。
{
"name": "C# Development",
"image": "mcr.microsoft.com/dotnet/sdk:10.0",
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csharp",
"ms-dotnettools.csdevkit",
"ms-dotnettools.vscode-dotnet-runtime"
],
"settings": {
"editor.formatOnSave": true
}
}
},
"postCreateCommand": "dotnet --version"
}
ポイント
-
mcr.microsoft.com/dotnet/sdk:10.0はMicrosoft公式の.NET 10 SDKイメージです -
ms-dotnettools.csdevkitはC# Dev Kitで、IntelliSenseやデバッグなどの快適な開発体験を提供します -
postCreateCommandでコンテナ起動後に.NETのバージョンを確認します
Step 2: DevContainerを起動する
- VSCodeの左下のリモートメニュー(
><アイコン)をクリック - コンテナーで再度開く を選択
起動完了後、ターミナルで.NETのバージョンを確認します。
dotnet --version
以下のように表示されれば成功です。
10.0.202
Step 3: プロジェクトを作成する
DevContainer内のターミナルで以下を実行します。
ソリューションの作成
dotnet new sln -n hello-csharp
クラスライブラリの作成
dotnet new classlib -n MyLibrary -f net10.0 -o src/MyLibrary
テストプロジェクトの作成
dotnet new xunit -n MyLibrary.Tests -f net10.0 -o tests/MyLibrary.Tests
ソリューションにプロジェクトを追加する
dotnet sln add src/MyLibrary/MyLibrary.csproj
dotnet sln add tests/MyLibrary.Tests/MyLibrary.Tests.csproj
テストプロジェクトからクラスライブラリを参照する
dotnet add tests/MyLibrary.Tests/MyLibrary.Tests.csproj \
reference src/MyLibrary/MyLibrary.csproj
補足:
-oオプションで出力先フォルダを指定することで、プロジェクト名のサブフォルダが二重に作成されるのを防げます。
Step 4: ソースファイルを作成する
src/MyLibrary/Calculator.cs
自動生成された Class1.cs を削除して、Calculator.cs を作成します。
rm src/MyLibrary/Class1.cs
namespace MyLibrary;
/// <summary>
/// 基本的な四則演算を提供するクラス
/// </summary>
public class Calculator
{
/// <summary>2つの値を加算します</summary>
public double Add(double a, double b) => a + b;
/// <summary>2つの値を減算します</summary>
public double Subtract(double a, double b) => a - b;
/// <summary>2つの値を乗算します</summary>
public double Multiply(double a, double b) => a * b;
/// <summary>2つの値を除算します</summary>
/// <exception cref="DivideByZeroException">bが0の場合にスローします</exception>
public double Divide(double a, double b)
{
if (b == 0)
throw new DivideByZeroException("0で除算することはできません。");
return a / b;
}
}
tests/MyLibrary.Tests/CalculatorTests.cs
自動生成された UnitTest1.cs を削除して、CalculatorTests.cs を作成します。
rm tests/MyLibrary.Tests/UnitTest1.cs
using MyLibrary;
namespace MyLibrary.Tests;
public class CalculatorTests
{
private readonly Calculator _calculator = new();
[Fact]
public void Add_正常系_正しい合計を返す()
{
// Arrange
double a = 3, b = 4;
// Act
double result = _calculator.Add(a, b);
// Assert
Assert.Equal(7, result);
}
[Fact]
public void Subtract_正常系_正しい差を返す()
{
double result = _calculator.Subtract(10, 3);
Assert.Equal(7, result);
}
[Fact]
public void Multiply_正常系_正しい積を返す()
{
double result = _calculator.Multiply(3, 4);
Assert.Equal(12, result);
}
[Fact]
public void Divide_正常系_正しい商を返す()
{
double result = _calculator.Divide(10, 2);
Assert.Equal(5, result);
}
[Fact]
public void Divide_ゼロ除算_例外をスローする()
{
// DivideByZeroExceptionがスローされることを確認
Assert.Throws<DivideByZeroException>(() => _calculator.Divide(10, 0));
}
// Theory + InlineDataで複数パターンをまとめてテスト
[Theory]
[InlineData(1, 2, 3)]
[InlineData(-1, -2, -3)]
[InlineData(0, 0, 0)]
[InlineData(1.5, 2.5, 4.0)]
public void Add_複数パターン_正しい合計を返す(double a, double b, double expected)
{
double result = _calculator.Add(a, b);
Assert.Equal(expected, result);
}
}
xUnitのポイント
-
[Fact]— 単一のテストケース -
[Theory]+[InlineData]— 複数のパターンをまとめてテスト(パラメータ化テスト) - テストメソッド名は日本語でもOKで、テスト結果の可読性が上がります
Step 5: ビルドしてテストを実行する
ビルド
dotnet build
テストの実行
dotnet test --logger "console;verbosity=normal"
MyLibrary net10.0 succeeded (0.7s)
MyLibrary.Tests net10.0 succeeded (0.6s)
[xUnit.net 00:00:00.18] Discovering: MyLibrary.Tests
[xUnit.net 00:00:00.32] Discovered: MyLibrary.Tests
[xUnit.net 00:00:00.37] Starting: MyLibrary.Tests
[xUnit.net 00:00:00.45] Finished: MyLibrary.Tests
Passed MyLibrary.Tests.CalculatorTests.Add_正常系_正しい合計を返す [16 ms]
Passed MyLibrary.Tests.CalculatorTests.Subtract_正常系_正しい差を返す [< 1 ms]
Passed MyLibrary.Tests.CalculatorTests.Divide_ゼロ除算_例外をスローする [< 1 ms]
Passed MyLibrary.Tests.CalculatorTests.Divide_正常系_正しい商を返す [< 1 ms]
Passed MyLibrary.Tests.CalculatorTests.Add_複数パターン_正しい合計を返す(a: -1, b: -2, expected: -3) [< 1 ms]
Passed MyLibrary.Tests.CalculatorTests.Add_複数パターン_正しい合計を返す(a: 1, b: 2, expected: 3) [< 1 ms]
Passed MyLibrary.Tests.CalculatorTests.Add_複数パターン_正しい合計を返す(a: 0, b: 0, expected: 0) [< 1 ms]
Passed MyLibrary.Tests.CalculatorTests.Add_複数パターン_正しい合計を返す(a: 1.5, b: 2.5, expected: 4) [< 1 ms]
Passed MyLibrary.Tests.CalculatorTests.Multiply_正常系_正しい積を返す [< 1 ms]
Test Run Successful.
Total tests: 9
Passed: 9
Total time: 1.4815 Seconds
Test summary: total: 9, failed: 0, succeeded: 9, skipped: 0, duration: 1.8s
Build succeeded in 5.1s
全9テストがPassedになれば完了です。
まとめ
| 項目 | 内容 |
|---|---|
| .NETバージョン | .NET 10(LTS・2028年までサポート) |
| テストフレームワーク | xUnit |
| プロジェクト構成 | クラスライブラリ + テストプロジェクト |
| ソリューション管理 | .slnファイルで一元管理 |
C++編との比較
| C++(第2弾) | C#(本記事) | |
|---|---|---|
| ビルドシステム | CMake | dotnet CLI |
| パッケージ管理 | vcpkg | NuGet(dotnet add package) |
| テスト | Google Test | xUnit |
| 設定ファイル | CMakeLists.txt | .csproj / .sln |
C#は dotnet コマンド一本でプロジェクト作成・ビルド・テスト・パッケージ管理が完結するため、C++と比べて環境構築のシンプルさが際立ちます。