Skip to content
Published on

モダン .NET 2026 完全ガイド - .NET 9 · C# 13 · F# 9 · ASP.NET Core · Blazor United · MAUI · Aspire · EF Core 9 徹底解説

Authors

プロローグ — 2026年、.NET はもう「Windows の Java」ではない

2010年代までの .NET の見られ方はシンプルだった。「Windows Server に IIS を入れて C# を書く Microsoft スタック」。行き先は「Java のライセンスを買えない所」ではなく「Windows でショッピングモールを動かす所」だった。

2026年にはその絵が完全に違う。

  • クロスプラットフォームが既定 — Linux・macOS・iOS・Android・WebAssembly・組み込みまで、同じコードが動く。
  • AOT がメインストリームdotnet publish -p:PublishAot=true 一行で 8MB のシングルバイナリが出る。
  • 無料・オープンソース — .NET 自体が MIT ライセンスで GitHub 上で開発されている。
  • クラウドの一級市民 — AWS Lambda・Google Cloud Run・Azure App Service のすべてで第一級サポート。

.NET 9 は 2024年11月に STS(Standard Term Support、18 か月)として出て、.NET 10 が 2025年11月に LTS(Long Term Support、36 か月)として出た。2026年5月現在、新規プロジェクトはほぼすべて .NET 10 に落ち着き、.NET 9 は移行中のプロジェクトの中間点という位置づけだ。

本稿は2026年の .NET スタックを端から端まで整理する。ランタイム・言語・Web・UI・データ・分散・ゲーム・テストまで、そして「どこで何のライブラリを使うか」を決めるマトリクスまで。


第1章 · .NET ランタイム — STS と LTS のサイクル

.NET は2年周期で LTS を出す。偶数年が LTS、奇数年が STS。

  • .NET 6(2021年11月、LTS) — 2024年11月 EOL
  • .NET 7(2022年11月、STS) — 2024年5月 EOL
  • .NET 8(2023年11月、LTS) — 2026年11月 EOL
  • .NET 9(2024年11月、STS) — 2026年5月 EOL
  • .NET 10(2025年11月、LTS) — 2028年11月 EOL

2026年5月で .NET 9 のサポートが終わった。新規プロジェクトは .NET 10 で始めるのが正解。.NET 8 LTS は11月まで生き残る。

# 現在のSDKを確認
dotnet --list-sdks

# .NET 10 のインストール(macOS Homebrew)
brew install --cask dotnet-sdk

# global.json で特定バージョンを固定
cat > global.json <<EOF
{
  "sdk": {
    "version": "10.0.100",
    "rollForward": "latestFeature"
  }
}
EOF

# 新規プロジェクト
dotnet new console -n HelloWorld
cd HelloWorld
dotnet run

ランタイムの核となるキーワードは3つ。

  • CoreCLR — JIT コンパイラ、メインのランタイム。ARM64・x64・Apple Silicon で一級市民。
  • Mono — WebAssembly・iOS・Android で使われる軽量ランタイム。
  • NativeAOT — 事前コンパイル、JIT なしで単一ネイティブバイナリ。.NET 10 で ASP.NET Core を完全サポート。

覚える一行:「.NET 10 が2028年まで生き残る LTS、.NET 9 が2026年5月で終わる STS」


第2章 · C# 13 — params コレクション・lock オブジェクト・partial メンバー

.NET 9 と一緒に出た C# 13 が日常のコードを変えた。大きな3つ:

params コレクションparams パラメータが配列だけを受けるのをやめた。IEnumerableSpanReadOnlySpan・任意のコレクション型を受ける。

// C# 12 まで — params object[] のみ
void Log(params object[] args) { }

// C# 13 — params ReadOnlySpan<object>
void Log(params ReadOnlySpan<object> args)
{
    foreach (var arg in args)
        Console.WriteLine(arg);
}

// 呼び出し時に配列の確保がない。Span はスタック割り当て。
Log("hello", 42, DateTime.Now);

lock オブジェクトlock キーワードが新しい System.Threading.Lock 型を受ける。従来の lock(obj) より約 30% 速く、誤った使い方をコンパイラが捕まえる。

using System.Threading;

public class Counter
{
    private readonly Lock _lock = new();
    private int _count;

    public void Increment()
    {
        lock (_lock)
        {
            _count++;
        }
    }
}

partial プロパティとインデクサ — メソッドだけだった partial がプロパティ・インデクサにも拡張された。ソースジェネレータがさらに強くなる。

public partial class ViewModel
{
    public partial string Name { get; set; }
}

// 別ファイルでソースジェネレータが実装を提供
public partial class ViewModel
{
    private string _name = "";
    public partial string Name
    {
        get => _name;
        set { _name = value; OnPropertyChanged(); }
    }
}

エスケープシーケンス\e が ESC 文字(0x1B)として追加された。ANSI カラーコードを書くときが綺麗になる。

Console.WriteLine("\e[31mRed text\e[0m");

C# 14 は .NET 10 と一緒に出た。新キーワード field(自動プロパティのバッキングフィールド参照)、partial コンストラクタ、拡張メンバー(extension everything)が大きな3つ。


第3章 · F# 9 / F# 10 — 関数型・AI フレンドリー・実用主義

F# は Microsoft の ML 系関数型言語。.NET 上で OCaml に近い文法で書く。

2026年の F# は2つの理由で再注目されている。

  • AI コード生成と相性が良い — F# は式ベースなので LLM が短く正しいコードを出しやすい。
  • データ処理・金融 — Jet・Bank of America、そして日本のいくつかの金融機関で実用例がある。

F# 9 のハイライト:コンピュテーション式の改善、null 性解析、診断メッセージの整理。F# 10 は .NET 10 と一緒に出た。

最小の F# 例 — フィボナッチ。

let rec fib n =
    match n with
    | 0 | 1 -> n
    | _ -> fib (n - 1) + fib (n - 2)

[0..10]
|> List.map fib
|> List.iter (printfn "%d")

レコードと判別共用体(discriminated union)は F# の核。

type Shape =
    | Circle of radius: float
    | Rectangle of width: float * height: float
    | Triangle of a: float * b: float * c: float

let area shape =
    match shape with
    | Circle r -> System.Math.PI * r * r
    | Rectangle (w, h) -> w * h
    | Triangle (a, b, c) ->
        let s = (a + b + c) / 2.0
        sqrt (s * (s - a) * (s - b) * (s - c))

printfn "%f" (area (Circle 5.0))

F# は dotnet fsi で REPL になる。Jupyter でも .NET Interactive カーネルとして動く。


第4章 · VB.NET — メンテナンスモード、まだ死んでいない

Visual Basic .NET は Microsoft の公式発表どおり「メンテナンスモード」だ。新しい言語機能は入らないが、.NET ランタイム上で動き続ける。

  • Windows フォーム・WPF・コンソールアプリは依然として VB.NET で作れる。
  • C# の新機能(レコード、init セッター、拡張パターンマッチ)は VB.NET には入らない。
  • 既存のコードベースは引き続きコンパイル・実行され、セキュリティアップデートも受ける。

2026年に新規プロジェクトを VB.NET で始める理由はほぼない。だが20年前の ASP.NET Web Forms システムが VB.NET なら、移行コストはそのまま残っている。


第5章 · ASP.NET Core 10 — Minimal API、Native AOT

ASP.NET Core は .NET の上の Web フレームワーク。.NET 6 以降の標準パターンは2つ:

  • Minimal API — Express のように 1 ファイルにルートを並べる。
  • MVC / Razor Pages — フルスタック、コントローラ・ビュー・モデル。

最小の Minimal API。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello, World!");
app.MapGet("/hello/{name}", (string name) => $"Hello, {name}!");
app.MapPost("/items", (Item item) => Results.Created($"/items/{item.Id}", item));

app.Run();

record Item(int Id, string Name);

ASP.NET Core 10 の Native AOT サポートが大きな変化だ。コールドスタートは 100ms 以下、メモリは半分、シングルバイナリは 10MB。

dotnet publish -c Release -p:PublishAot=true
# bin/Release/net10.0/<rid>/publish/MyApi (シングルバイナリ)

AOT の制約は明確だ。リフレクション・動的コード・Expression.Compile() は使えない。代わりにソースジェネレータがコンパイル時にコードを生成する。System.Text.Json もソースジェネレータ経由で使う。

[JsonSerializable(typeof(User))]
public partial class AppJsonContext : JsonSerializerContext { }

// AOT フレンドリーなシリアライズ
var json = JsonSerializer.Serialize(user, AppJsonContext.Default.User);

第6章 · Blazor United — Server・WASM・SSR を一度に

Blazor は C# で SPA を書くフレームワーク。2026年のコアモードは3つ、そしてそれらを混ぜる「United」パターン。

  • Server — UI イベントを SignalR でサーバへ送り、DOM の差分だけクライアントへ返す。初回描画が速い、常時接続が必要。
  • WebAssembly — C# コードを WASM にコンパイルしてブラウザ内で直接実行。オフライン可、初回ダウンロードが大きい。
  • SSR(Static Server Rendering) — サーバが HTML だけをレンダリング、インタラクティブなし。SEO・ランディングページ向け。

.NET 8 からこの3つをページ単位で 1 プロジェクト内で混ぜられるようになった。

@page "/counter"
@rendermode InteractiveServer

<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;
    private void IncrementCount() => currentCount++;
}

@rendermodeInteractiveServerInteractiveWebAssemblyInteractiveAuto に切り替えると、同じコンポーネントが別の環境で動く。InteractiveAuto は最初は Server で始め、WASM バンドルが読み込まれたら自動でクライアント側に切り替える。

要点:

  • コンポーネントモデル — React・Vue に近いコンポーネント、ただし C# で。
  • JS Interop — 必要なときだけ IJSRuntime で JS を呼ぶ。
  • AOT WASM<RunAOTCompilation>true</RunAOTCompilation> で WASM AOT、性能はおおむね2倍。

第7章 · .NET MAUI 9 — iOS・Android・macOS・Windows を一度に

MAUI(Multi-platform App UI)は Xamarin.Forms の後継だ。2026年5月時点で Xamarin.Forms は正式に EOL(2024年5月)済み、新規モバイルプロジェクトはすべて MAUI。

dotnet new maui -n MyApp
cd MyApp

# iOS
dotnet build -t:Run -f net10.0-ios
# Android
dotnet build -t:Run -f net10.0-android
# macOS
dotnet build -t:Run -f net10.0-maccatalyst
# Windows
dotnet build -t:Run -f net10.0-windows10.0.19041.0

最小の XAML ページ。

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.MainPage">
    <VerticalStackLayout Padding="20" Spacing="10">
        <Label Text="Hello, MAUI!" FontSize="32" />
        <Button Text="Click me" Clicked="OnClicked" />
        <Label x:Name="CounterLabel" Text="0" />
    </VerticalStackLayout>
</ContentPage>
public partial class MainPage : ContentPage
{
    int count = 0;
    public MainPage() { InitializeComponent(); }
    void OnClicked(object sender, EventArgs e)
    {
        count++;
        CounterLabel.Text = count.ToString();
    }
}

MAUI 9 のハイライト:

  • ネイティブコントロール — 各プラットフォームの本物のネイティブウィジェットを使う。iOS は UIKit、Android は Material。
  • Hot Reload — XAML と C# の両方が Hot Reload 対応。
  • MVU — Comet スタイルの MVU(Model-View-Update)パターンも試験中。

弱点は正直に認めるべきだ。iOS・Android ともに一級だが、React Native・Flutter ほどのコミュニティ生態系はない。日本・韓国の社内アプリ・既存 Xamarin の移行が主戦場だ。


第8章 · Avalonia 11 · Uno Platform 5 — コミュニティの代替案

Microsoft が作っていない .NET UI フレームワークが2つ、2026年でも強い。

Avalonia 11 — Linux・macOS・Windows・iOS・Android・WebAssembly で動く XAML ベース UI。JetBrains Rider は UI の一部を Avalonia で作っている。

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="HelloAvalonia.MainWindow"
        Title="HelloAvalonia">
  <StackPanel Margin="20">
    <TextBlock Text="Hello from Avalonia!" FontSize="24" />
    <Button Content="Click me" Click="OnClick" />
  </StackPanel>
</Window>

Uno Platform 5 — WinUI 3 XAML をあらゆるプラットフォームで再利用。WebAssembly・Skia レンダリングまで対応。Windows 中心の開発者が一度書いて複数 OS に展開したいときに選ぶ。

MAUI とこの2つの違い:

  • MAUI — Microsoft 公式、ネイティブコントロール、Android・iOS・Windows・macOS のみ。
  • Avalonia — コミュニティ、独自レンダリング(Skia)、Linux 一級、デスクトップに強い。
  • Uno — コミュニティ、WinUI XAML 互換、WebAssembly に強い。

第9章 · .NET Aspire 9 — 分散アプリのオーケストレーション

Aspire は .NET 8 と一緒に出た分散アプリのフレームワークだ。「複数のサービスを 1 つのソリューションにまとめ、1 つのコマンドで立ち上げ、1 つのダッシュボードで見る」が核。

// AppHost/Program.cs
var builder = DistributedApplication.CreateBuilder(args);

var redis = builder.AddRedis("cache");
var postgres = builder.AddPostgres("db").AddDatabase("appdb");

var api = builder.AddProject<Projects.MyApi>("api")
    .WithReference(redis)
    .WithReference(postgres);

builder.AddProject<Projects.MyWeb>("web")
    .WithReference(api);

builder.Build().Run();
dotnet run --project AppHost
# ブラウザで https://localhost:17000 — Aspire Dashboard

Aspire Dashboard で見えるもの:

  • サービス一覧 — 各プロセスの状態・ログ・環境変数。
  • トレース — OpenTelemetry ベースの分散トレース。
  • メトリクス — メモリ・CPU・リクエスト数。
  • ログ集約 — すべてのサービスログを 1 か所で検索。

Aspire 9 の新機能:統合モジュール強化(Azure Service Bus・Postgres・MongoDB・Kafka)、GitHub Codespaces サポート、デプロイ用マニフェスト(Helm・Bicep)の自動生成。

覚える一行:「docker-compose がコンテナの docker-compose なら、Aspire は .NET サービスの docker-compose」


第10章 · Entity Framework Core 9 — JSON・コンパイル済みモデル

EF Core は .NET 界隈の標準 ORM だ。9.0 の大きな変化:

  • JSON 列の強化 — Postgres・SQL Server の JSON 列を LINQ で直接クエリ。
  • コンパイル済みモデル — 起動時のモデルメタデータ生成をコンパイル時に前倒し。
  • HierarchyId — SQL Server の階層型を LINQ で。
  • Cosmos DB の改善 — 部分更新、階層パーティションキー。
public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public BlogMetadata Metadata { get; set; } = new();
}

public class BlogMetadata
{
    public string Author { get; set; } = "";
    public List<string> Tags { get; set; } = new();
}

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs => Set<Blog>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>().OwnsOne(b => b.Metadata, b => b.ToJson());
    }
}

// JSON 内のフィールドを LINQ でクエリ
var blogs = await db.Blogs
    .Where(b => b.Metadata.Tags.Contains("dotnet"))
    .ToListAsync();

マイグレーションは dotnet ef migrations add / dotnet ef database update で管理する。

dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update

第11章 · Dapper 3 · Marten — 軽量代替

EF Core がフル ORM なら、Dapper はマイクロ ORM。SQL を直接書き、結果のマッピングだけを自動化する。

using Dapper;
using Npgsql;

await using var conn = new NpgsqlConnection(connStr);
var users = await conn.QueryAsync<User>(
    "SELECT id, name FROM users WHERE active = @active",
    new { active = true });

foreach (var u in users)
    Console.WriteLine($"{u.Id}: {u.Name}");

使うとき:ホットパスのクエリ、複雑な SQL、EF の抽象が邪魔なとき。

Marten — Postgres をドキュメント DB + イベントストアとして使う。CQRS・イベントソーシングに強い。

var store = DocumentStore.For(opts =>
{
    opts.Connection(connStr);
    opts.Events.AddEventType(typeof(OrderPlaced));
});

await using var session = store.LightweightSession();
session.Events.Append(orderId, new OrderPlaced(orderId, items));
await session.SaveChangesAsync();

使うとき:すでに Postgres がある環境、イベントソーシングが必要なドメイン。


第12章 · MediatR 13 — CQRS パターン

MediatR は in-process のメディエータパターンライブラリ。ハンドラ・通知・パイプライン挙動をきれいに分離する。

public record GetUserById(int Id) : IRequest<User>;

public class GetUserByIdHandler : IRequestHandler<GetUserById, User>
{
    private readonly AppDbContext _db;
    public GetUserByIdHandler(AppDbContext db) { _db = db; }

    public async Task<User> Handle(GetUserById req, CancellationToken ct)
    {
        return await _db.Users.FindAsync(new object[] { req.Id }, ct)
            ?? throw new KeyNotFoundException();
    }
}

// コントローラ
public class UsersController(IMediator mediator) : ControllerBase
{
    [HttpGet("{id}")]
    public Task<User> Get(int id) => mediator.Send(new GetUserById(id));
}

2024年末、作者(Jimmy Bogard)が MediatR を商用化すると発表し、コミュニティの一部がフォークを作った(例:BrighterMediator.SourceGenerator)。そのため2026年の新規プロジェクトでは、MediatR を使うかソースジェネレータベースの代替を使うかを決める必要がある。


第13章 · Orleans 9 — 仮想アクター、グレインベースの分散

Orleans は Microsoft Research が作った分散アクターフレームワーク。仮想アクター(virtual actor)モデルが核:グレイン(grain)は ID で識別され、配置はランタイムが管理する。

public interface IUserGrain : IGrainWithIntegerKey
{
    Task<string> GetNameAsync();
    Task SetNameAsync(string name);
}

public class UserGrain : Grain, IUserGrain
{
    private string _name = "";
    public Task<string> GetNameAsync() => Task.FromResult(_name);
    public Task SetNameAsync(string name) { _name = name; return Task.CompletedTask; }
}

// クライアント
var user = client.GetGrain<IUserGrain>(123);
await user.SetNameAsync("Alice");
var name = await user.GetNameAsync();

使うとき:ゲームバックエンド(Halo・Forza・Gears of War が Orleans)、IoT、チャット、リアルタイムマルチプレイ。

代替:Akka.NET 1.5 — Akka の .NET ポート、明示的なアクターモデル、永続化・クラスタリング対応。


第14章 · SignalR · gRPC — リアルタイム通信

SignalR — 双方向リアルタイム通信。WebSocket・Server-Sent Events・ロングポーリングを自動でネゴシエート。

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

// Program.cs
builder.Services.AddSignalR();
app.MapHub<ChatHub>("/chathub");

クライアントは JS・.NET・Java・Python とすべてある。

gRPC for .NET — protobuf ベースの RPC。マイクロサービス間通信・多言語環境に強い。

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }
public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(HelloRequest req, ServerCallContext ctx)
    {
        return Task.FromResult(new HelloReply { Message = $"Hello {req.Name}" });
    }
}

使うとき:マイクロサービス内部通信、多言語クライアント、ストリーミング RPC。


第15章 · ロギング・可観測性 — Serilog 4、OpenTelemetry

デフォルトは Microsoft.Extensions.Logging。カテゴリ・フィルタ・スコープが標準装備。

public class OrderService(ILogger<OrderService> logger)
{
    public void Process(Order order)
    {
        logger.LogInformation("Processing order {OrderId} for {Amount}",
            order.Id, order.Amount);
    }
}

構造化ログ・ファイル・Elasticsearch シンクが必要なら Serilog 4

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console()
    .WriteTo.File("logs/app-.txt", rollingInterval: RollingInterval.Day)
    .WriteTo.Seq("http://localhost:5341")
    .CreateLogger();

Log.Information("User {UserId} logged in from {IP}", userId, ip);

OpenTelemetry — トレース・メトリクス・ログのベンダー中立標準。.NET で第一級サポート。

builder.Services.AddOpenTelemetry()
    .WithTracing(t => t
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddOtlpExporter())
    .WithMetrics(m => m
        .AddAspNetCoreInstrumentation()
        .AddRuntimeInstrumentation()
        .AddOtlpExporter());

Aspire Dashboard は OpenTelemetry を受けて可視化する。Jaeger・Grafana・Datadog も同じプロトコル。


第16章 · テスト — xUnit 3、NUnit 4、MSTest 3

3つの主要テストフレームワーク、そしてその上のモッキングライブラリ群。

xUnit 3 — もっとも人気の選択。2025年に v3 が出た。非同期に優しく、属性がきれい。

public class CalculatorTests
{
    [Fact]
    public void Add_TwoNumbers_ReturnsSum()
    {
        var sut = new Calculator();
        Assert.Equal(5, sut.Add(2, 3));
    }

    [Theory]
    [InlineData(1, 1, 2)]
    [InlineData(2, 3, 5)]
    [InlineData(-1, 1, 0)]
    public void Add_Various_ReturnsExpected(int a, int b, int expected)
    {
        var sut = new Calculator();
        Assert.Equal(expected, sut.Add(a, b));
    }
}

NUnit 4 — JUnit スタイル。属性セットが豊富。

MSTest 3 — Microsoft 公式、Visual Studio との統合がもっとも深い。

モッキングライブラリ:

  • Moq 4.20 — もっとも人気だが、2023年の SponsorLink 騒動で一部利用者が離れた。
  • NSubstitute 5 — API がきれい、Moq の代替として人気上昇中。
  • FakeItEasy 8 — foggy object スタイル、Java の Mockito に似ている。
// NSubstitute
var repo = Substitute.For<IUserRepository>();
repo.FindById(1).Returns(new User(1, "Alice"));

var sut = new UserService(repo);
var user = sut.GetUser(1);

repo.Received(1).FindById(1);

BenchmarkDotNet 0.14 — 性能マイクロベンチマークの標準。

[MemoryDiagnoser]
public class StringBenchmarks
{
    [Benchmark]
    public string ConcatStrings()
    {
        var s = "";
        for (var i = 0; i < 100; i++) s += i;
        return s;
    }

    [Benchmark]
    public string StringBuilder()
    {
        var sb = new StringBuilder();
        for (var i = 0; i < 100; i++) sb.Append(i);
        return sb.ToString();
    }
}

BenchmarkRunner.Run<StringBenchmarks>();

第17章 · 開発体験 — dotnet watch・Hot Reload・Polyglot Notebooks

dotnet watch はファイル変更を検知して自動でリビルドと再起動を行う。

dotnet watch run
# Program.cs を編集 → 自動再起動
# Razor ページを編集 → Hot Reload(再起動なしで反映)

ASP.NET Core・Blazor・MAUI のすべてが Hot Reload に対応。C# メソッド本体の変更・XAML・CSS・Razor マークアップは再起動なしで反映、シグネチャの変更は再起動が必要。

Polyglot Notebooks — Jupyter スタイルの .NET ノートブック。C#・F#・PowerShell・SQL を 1 つのノートブックで混ぜる。

dotnet tool install -g Microsoft.dotnet-interactive
dotnet interactive jupyter install

VS Code 拡張(Polyglot Notebooks)で .ipynb.dib ファイルを開く。データ探索・ドキュメント・教材に強い。

// .NET ノートブックのセル
#r "nuget: System.Text.Json"

using System.Text.Json;

var json = """{"name": "Alice", "age": 30}""";
var doc = JsonDocument.Parse(json);
display(doc.RootElement);

第18章 · ビルドシステム — dotnet CLI、MSBuild、NUKE、FAKE、Cake

既定のビルドシステムは dotnet CLI と MSBuild。多くのプロジェクトはこれで十分。

dotnet new sln -n MySolution
dotnet new classlib -n MyLibrary
dotnet sln add MyLibrary
dotnet build
dotnet test
dotnet pack
dotnet nuget push -s nuget.org -k <api-key>

CI/CD パイプラインが複雑になったら次の3つから選ぶ:

  • NUKE — ビルドスクリプトを C# で書く。型安全、IDE 補完、デバッグ可能。
  • Cake.cake スクリプトファイル、C# ライクな DSL。
  • FAKE — F# のビルドシステム、関数型 DSL。

NUKE の例 — _build/Build.cs

class Build : NukeBuild
{
    public static int Main() => Execute<Build>(x => x.Compile);

    Target Clean => _ => _
        .Executes(() => Directory.Delete("bin", true));

    Target Compile => _ => _
        .DependsOn(Clean)
        .Executes(() => DotNetTasks.DotNetBuild(s => s
            .SetConfiguration("Release")));

    Target Test => _ => _
        .DependsOn(Compile)
        .Executes(() => DotNetTasks.DotNetTest(s => s
            .SetConfiguration("Release")
            .EnableNoBuild()));
}
./build.sh test
# または
nuke test

第19章 · NuGet 6.12 — パッケージ管理

NuGet は .NET にとっての npm・pip・Maven にあたる。

# パッケージ追加
dotnet add package Serilog --version 4.0.0

# 更新
dotnet add package Serilog

# 削除
dotnet remove package Serilog

# 復元
dotnet restore

Directory.Packages.props による中央集権バージョン管理:

<Project>
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="Serilog" Version="4.0.0" />
    <PackageVersion Include="Dapper" Version="3.0.0" />
  </ItemGroup>
</Project>

各プロジェクトはバージョンなしで PackageReference だけを書く。大きなソリューションでのバージョンドリフトを防ぐ。

global.json が SDK バージョン、Directory.Packages.props がパッケージバージョン。両方ともモノレポで標準。


第20章 · ゲーム開発 — Unity 6、Godot、Stride

Unity 6(2024年末リリース、2026年安定) — ゲームエンジン市場シェア1位。C# 13 まで対応。URP(Universal Render Pipeline)・HDRP(High Definition)・DOTS(Data-Oriented Tech Stack)が核。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField] float speed = 5f;
    Rigidbody rb;

    void Start() { rb = GetComponent<Rigidbody>(); }

    void Update()
    {
        var h = Input.GetAxis("Horizontal");
        var v = Input.GetAxis("Vertical");
        rb.linearVelocity = new Vector3(h, 0, v) * speed;
    }
}

2023年の価格政策騒動以後、Unity は方針を撤回したが信頼は一度崩れた。2026年でもメジャーインディ・モバイルでは Unity が圧倒的だが、新規プロジェクトで Godot・Unreal へ移る流れもある。

Godot 4(C#) — オープンソースのゲームエンジン。GDScript が主力だが C# バインディングも安定。モバイル・インディで人気上昇中。

Stride 4 — 純粋な .NET のゲームエンジン。すべてを C# で書く。コミュニティは小さいが .NET 開発者には馴染みやすいワークフロー。


第21章 · デスクトップレガシー — WPF・WinForms

WPF(Windows Presentation Foundation)と WinForms は2026年でも「レガシー」ではない。どちらも .NET 10 を対象に更新が出続け、Windows エンタープライズデスクトップの標準だ。

// WinForms
public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        var btn = new Button { Text = "Click me", Location = new Point(20, 20) };
        btn.Click += (s, e) => MessageBox.Show("Hello!");
        Controls.Add(btn);
    }
}

WPF は XAML・MVVM・強力なデータバインディング。日本・韓国のエンタープライズ社内ツールの相当部分が WPF。

WinUI 3 — Windows 11 時代の新 UI フレームワーク。Windows App SDK でパッケージ化。MAUI Windows も内部的に WinUI 3 を使う。

選択マトリクス:

  • 新規 Windows 専用アプリ → WinUI 3 + Windows App SDK
  • 既存 WPF コードベースの保守 → WPF のまま
  • Windows + 他 OS → MAUI または Avalonia
  • シンプルな社内ツール → WinForms(今でも速くてシンプル)

第22章 · クラウドデプロイ — Azure・AWS・GCP

.NET はどのクラウドでも一級市民。

Azure App Service — もっとも自然な選択。新しい .NET のリリースがまずここに来る。

az webapp up --name myapp --runtime "DOTNETCORE:10.0"

AWS Lambda — .NET 10 ランタイムをサポート。コールドスタートは AOT で 100ms 以下。

public class Function
{
    public async Task<APIGatewayHttpApiV2ProxyResponse> Handle(
        APIGatewayHttpApiV2ProxyRequest req, ILambdaContext ctx)
    {
        return new APIGatewayHttpApiV2ProxyResponse
        {
            StatusCode = 200,
            Body = $"Hello from {req.RequestContext.Http.Path}"
        };
    }
}

デプロイは dotnet lambda deploy-function または SAM・CDK。

Google Cloud Run — コンテナベース。Dockerfile 1 つで終わる。

FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
WORKDIR /app
EXPOSE 8080

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
COPY . /src
WORKDIR /src
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApi.dll"]

Aspire がこの3つのマニフェストを自動生成する。dotnet run --project AppHost --publisher manifest 1 回で K8s YAML・Bicep・Cloud Run マニフェストが出る。


第23章 · Roslyn アナライザ・ソースジェネレータ

Roslyn は C#・VB.NET のコンパイラ。コードをツリーとして見せ、ツリーを変換する API を提供する。

アナライザ(Analyzer) — ビルド時にコードを検査し警告・エラーを出す。StyleCop.AnalyzersMicrosoft.CodeAnalysis.NetAnalyzers が代表例。

dotnet add package Microsoft.CodeAnalysis.NetAnalyzers

ビルド時に数百のルールが自動適用される。.editorconfigdotnet_diagnostic.CA1822.severity = error といった行で個別調整する。

ソースジェネレータ(Source Generator) — コンパイル時にコードを生成する。AOT フレンドリーで、リフレクションの代替。

代表例:

  • System.Text.JsonJsonSerializerContext ソースジェネレータで JSON シリアライズコードを生成。
  • MapperGen / Mapperly — DTO マッピングコードを自動生成。
  • Mediator.SourceGenerator — MediatR をソースジェネレータで置き換え。
  • regex generator[GeneratedRegex(...)] 属性で正規表現マッチャーを生成。
public partial class EmailValidator
{
    [GeneratedRegex(@"^[^@]+@[^@]+\.[^@]+$")]
    private static partial Regex EmailRegex();

    public bool IsValid(string s) => EmailRegex().IsMatch(s);
}

ビルド時にコンパイラが EmailRegex() の本体を生成。実行時の正規表現コンパイルコストがない。


第24章 · 日本・韓国の .NET コミュニティ

日本

  • .NETラボ勉強会 — 東京で毎月開催される大きな .NET ミートアップ。
  • Microsoft Tokyo Build — Azure と .NET を統合したイベント。
  • MS Tech Summit Japan — 年 1 回の大型イベント。
  • Qiita .NET タグ — 日本語の .NET 記事がもっとも集まる場所。

韓国

  • .NET デブコミュニティコリア — Facebook・Discord。
  • マイクロソフト韓国 — Build Korea、AI Day など年に 5〜6 回のイベント。
  • .NETDev Korea カンファレンス — コミュニティ主導。
  • Hanbit Media・Insight Press が C#・.NET 書籍を継続的に出している。

英語圏のリソース:

  • dot.net — 公式サイト。
  • Microsoft Learn — 無料チュートリアル。
  • Stack Overflow / .NET タグ — 依然として Q&A の一次窓口。
  • r/dotnet、r/csharp — 活発な Reddit サブ。
  • Nick Chapsas、Tim Corey、Scott Hanselman — YouTube チャンネル。

エピローグ — 2026年の .NET 選択マトリクス

10年前は「.NET = Windows + IIS + Visual Studio」が答えだったが、2026年は答えが枝分かれする。

選択の基準を3行で。

  • 新規 Web API → ASP.NET Core 10 + Minimal API + AOT。可能なら Aspire で束ねる。
  • 新規モバイルアプリ → MAUI 9。Xamarin は EOL、新コードをそこに書く理由はない。
  • 新規フルスタック SPA → Blazor United(Server + WASM + SSR)。JS 生態系の方が馴染みがあれば ASP.NET Core + React。
  • データ処理・金融ドメイン → F# 9/10。関数型が最適。
  • 分散システム → Orleans 9 または Akka.NET。メッセージベースの分散。
  • ゲーム → Unity 6(シェア)、Godot 4(オープンソース)、Stride(純粋 .NET)。
  • Windows デスクトップ → WinUI 3(新規)、WPF(既存維持)、WinForms(シンプルなツール)。

ランタイムの核。

  • .NET 10 LTS — 2025年11月リリース、2028年11月までサポート。新規プロジェクトの既定。
  • .NET 9 STS — 2026年5月 EOL。移行中のプロジェクト。
  • .NET 8 LTS — 2026年11月 EOL。保守的な運用環境。

覚える一行:「.NET はもう Windows の Java ではない。2026年の .NET はクロスプラットフォーム・AOT・クラウド一級市民のフルスタックランタイムだ」

ツールは毎年変わるが核は変わらない。型・強力なライブラリ・フルスタック統合 — それが30年前に Visual Studio が約束したことであり、2026年の .NET が依然として守っていることだ。


References

— 完 —