LabHub

ブログ

モダン .NET 2026 — .NET 9 / .NET 10 LTS / Aspire / Blazor United / MAUI / Avalonia 11 / FastEndpoints 詳細ガイド

한국어English日本語

プロローグ — 「Java ではないもう一つのエンタープライズ」

2026年5月。あるシニアエンジニアが半分冗談でこう言った。「.NET を使っていない、と言う人は多いです。ただ、自分のカード会社のバックエンドが .NET で動いていることを知らない人も多い」。冗談ではあるが、半分は本気だ。

カンファレンスのステージは今でも TypeScript、Go、Rust のものだ。だが、決済・銀行・製造・公共・ゲームバックエンドの一角は .NET で動いている。そして .NET 自身も 2020年の .NET 5 統合以降、毎年11月に新メジャーを出して、勤勉に姿を変えてきた。

2024-2026年の出来事を並べると:

この記事は 2026年の .NET 陣営の地図 を一度に整理する。どのバージョンを選ぶか、ASP.NET Core 10 と FastEndpoints のどちらを使うか、Aspire は本当に必要か、MAUI vs Avalonia 11、EF Core vs Dapper、MediatR が商用化された後の CQRS パターン、NativeAOT の現実的な限界 — そして誰が .NET を選ぶべきかまで。

最初に一つだけ言っておく。.NET は死んでいない。 むしろ韓国・日本の enterprise・金融・政府システムでは、ますます深く根を下ろしている。JVM・Go・Node とは違う質感を持つ道具で、その質感が合うドメインは明らかに存在する。


1章 · 2026年の .NET 地図 — 一枚の表

領域2026年の事実上の標準備考
ランタイム.NET 10 LTS (2025-11).NET 9 は 2026-05 EOL 直前
言語C# 13 / C# 14F# 9、VB は stable 維持
Web バックエンドASP.NET Core 10 + Minimal APIs+ FastEndpoints / Carter
データEF Core 9 / Dapper / Marten選択肢が広い
メッセージングMassTransit / NServiceBus / WolverineMediatR 商用化の影響大
CQRSWolverine / Brighter / 自前MediatR 8.x は paid
クラウドオーケストレーション.NET AspireBicep + OTel 内蔵
Web UIBlazor UnitedServer + WASM + SSR
モバイル / デスクトップ.NET MAUIiOS/Android/Mac/Win
クロスプラットフォーム デスクトップAvalonia 11Linux 含む
ゲームUnity (.NET 8 ベース)、Stride、MonoGameUnity は独自ランタイム
デプロイコンテナ + NativeAOTself-contained は縮小
パッケージNuGet 6 + Central Package Managementglobal.json 標準化
解析Roslyn analyzers + StyleCop + Sonarnullable enforcement

要点を一文ずつ:


2章 · .NET 10 LTS (2025-11) — フラッグシップリリース

.NET 10 は 2025年11月に GA となり、Long Term Support 3年だ。つまり 2028年11月までパッチ対応。.NET 6 (2021-11)、.NET 8 (2023-11) に続く正式 LTS で、.NET 9 はその間の STS。

主な変更点:

LTS の意味は単に「パッチ期間が長い」ことではない。エコシステムのライブラリが最も追従することを意味する。EF Core 10、ASP.NET Core 10、Aspire 安定チャネル、MassTransit、MediatR フォーク群 — ほぼすべての主要ライブラリが .NET 10 を first-class target としている。

アップグレードの目安:


3章 · .NET 9 (2024-11) — STS との比較

.NET 9 は STS、つまり 18か月サポートなので 2026年5月に終わる。この記事が書かれている時期がちょうどそれだ。.NET 9 は「次の LTS、.NET 10 のための実験ノート」のような役割を果たした。

.NET 9 で入って .NET 10 で磨かれたもの:

要点: .NET 9 を運用しているチームは 2026年中盤までに .NET 10 へ移動する必要がある。.NET 8 (LTS) に戻る意味はない — .NET 8 自身も 2026年11月で終わる。

LTS / STS のリズムは今や明確だ:

エンタープライズは STS を丸ごとスキップするのが普通だ。つまり .NET 6 → 8 → 10 が標準ルート。


4章 · C# 13 / C# 14 — params collections、field accessor

C# は毎年11月、.NET と同時に新メジャーを出す。C# 13 は 2024年、C# 14 は 2025年に .NET 10 と一緒にリリースされた。

C# 13 の核:

C# 14 の核:

field キーワードを一目で見ると:

// 旧来 — backing field を明示
private string _name = string.Empty;
public string Name
{
    get => _name;
    set => _name = value?.Trim() ?? throw new ArgumentNullException();
}

// C# 14 — field で直接
public string Name
{
    get;
    set => field = value?.Trim() ?? throw new ArgumentNullException();
} = string.Empty;

_name を手で宣言しなくてもコンパイラが作ってくれる。もう _camelCase backing field のネーミング論争はいらない。


5章 · ASP.NET Core 10 — performance + DX

ASP.NET Core 10 は .NET 10 と同時に登場した。2026年5月時点で、モダン .NET Web の基本形は次のとおり。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenApi();
builder.Services.AddDbContext<AppDbContext>(opts =>
    opts.UseNpgsql(builder.Configuration.GetConnectionString("Default")));

var app = builder.Build();

app.MapOpenApi();              // /openapi/v1.json
app.MapScalarApiReference();   // Scalar UI 統合

app.MapGet("/users/{id:guid}", async (Guid id, AppDbContext db) =>
{
    var user = await db.Users.FindAsync(id);
    return user is null ? Results.NotFound() : Results.Ok(user);
})
.WithName("GetUser")
.WithOpenApi();

app.MapPost("/users", async (CreateUserDto dto, AppDbContext db) =>
{
    var user = new User(dto.Name, dto.Email);
    db.Users.Add(user);
    await db.SaveChangesAsync();
    return Results.Created($"/users/{user.Id}", user);
});

app.Run();

変わった点:

パフォーマンス数値 (TechEmpower 系マイクロベンチ):

2026年でも ASP.NET Core は、最も速いメインストリーム Web フレームワークの一つだ。


6章 · Aspire (2024-11 GA) — クラウドネイティブ・オーケストレーション

Aspire は 2024年11月に GA となった、.NET 陣営のクラウドネイティブ・オーケストレーション + ローカル開発環境 + テレメトリ統合ツールだ。名前は大袈裟だが、本質はシンプル。

Aspire が解決する問題:

AppHost プロジェクトの形:

var builder = DistributedApplication.CreateBuilder(args);

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

var redis = builder.AddRedis("cache");

var rabbitmq = builder.AddRabbitMQ("messaging");

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

builder.AddProject<Projects.WebFrontend>("web")
    .WithReference(apiService);

builder.Build().Run();

このコードを dotnet run すると:

  1. Postgres / Redis / RabbitMQ コンテナが自動で起動。
  2. API サービスと Web Frontend が .NET プロセスとして起動。
  3. 接続文字列が環境変数として自動注入。
  4. OpenTelemetry データが Aspire Dashboard に流れる。
  5. 分散トレース、ログ、メトリクスが一画面で見える。

Aspire Dashboard:

クラウドデプロイ:

docker-compose vs Aspire:

基準docker-composeAspire
定義言語YAMLC#
デバッグコンテナアタッチ.NET プロセスを直接デバッグ
テレメトリ別途インストール内蔵
クラウドデプロイ変換ツール別途内蔵 generator
.NET 以外のサービス良好良好 (Postgres、Redis、OS image など)

.NET マイクロサービスを運用するチームには Aspire が事実上 default となった。ただし、.NET 以外のサービスが多いポリグロット環境では docker-compose が依然として自然だ。


7章 · Blazor United — Server + WASM + SSR + streaming

Blazor は 2018年の WebAssembly hype から8年が経った 2026年現在、「一つのコンポーネントが複数のレンダーモードを選べる」単一モデルとして定着した。Microsoft 公式ドキュメントはこれを Blazor United と呼ぶ。

四つのレンダーモード:

  1. Static SSR — サーバで一回描いて終わり。最速、インタラクションなし。
  2. Streaming SSR — 非同期データ読み込み結果を chunked でストリーミング。
  3. Server interactive — SignalR ベース、サーバでイベント処理。
  4. WebAssembly interactive — クライアント WASM、オフライン可能。

一つのページがコンポーネント単位でモードを混ぜられる。

@page "/dashboard"
@rendermode InteractiveAuto

<h1>ダッシュボード</h1>
<StaticSummary />
<InteractiveChart />

InteractiveAuto は初回アクセス時に Server モード (SignalR) で速く立ち上がり、WASM ダウンロード完了後は WASM に切り替える。最初のインタラクション遅延を隠すパターン。

Blazor の強み:

Blazor の弱点:

誰が使うか: 社内ツール、B2B 管理画面、フルスタック .NET チームの SPA が sweet spot。公開マーケティングサイトや SEO 中心ページは Static SSR に限定。


8章 · .NET MAUI — クロスプラットフォームネイティブ

.NET MAUI (Multi-platform App UI) は 2022年に Xamarin.Forms の後継として登場し、2024-2026年に安定化した。iOS / Android / macOS / Windows を単一の C# コードで。

MAUI の構造:

MAUI Hybrid + Blazor Hybrid:

MAUI の中に BlazorWebView を載せると、Razor コンポーネントをネイティブアプリとして再利用できる。Web 用に作った Blazor UI をモバイルアプリにもほぼそのまま。

<BlazorWebView HostPage="wwwroot/index.html">
    <BlazorWebView.RootComponents>
        <RootComponent Selector="#app" ComponentType="{x:Type local:Main}" />
    </BlazorWebView.RootComponents>
</BlazorWebView>

このパターンは フルスタック .NET チームがモバイルアプリまで持つ ときに魅力的だ。React Native よりビルド/デプロイパイプラインが単純で、Flutter より .NET バックエンドとの統合が自然。

MAUI の弱点:

2026年の推奨: 社内モバイル / Windows デスクトップ限定。公開アプリストア向けコンシューマアプリは Flutter、SwiftUI/Compose、React Native と比較してから決める。


9章 · Avalonia 11 — 真のクロスプラットフォーム UI

Avalonia はコミュニティが作り .NET Foundation で運営されるオープンソースのクロスプラットフォーム UI フレームワークだ。2023年11月に 11.0 が、2024-2025年に 11.1 / 11.2 / 11.3 が順次リリース。

MAUI との違い:

基準.NET MAUIAvalonia 11
ガバナンスMicrosoftコミュニティ + 商用 (AvaloniaUI 社)
プラットフォームiOS/Android/Mac/WiniOS/Android/Mac/Win/Linux/WebAssembly
レンダリングプラットフォームネイティブコントロール独自レンダラ (Skia ベース)
UI 一貫性プラットフォームごと全プラットフォーム同一
デザインパターンXAML + handlersXAML + 独自コントロールツリー
Hot reload対応対応
デスクトップ重視度弱い強い

Avalonia が光るケース:

実例:

弱点:

2026年の推奨: WPF の自然な後継。Linux/Mac デスクトップ .NET アプリなら第一候補。


10章 · Entity Framework Core 9

EF Core 9 は 2024年11月に .NET 9 と一緒に出て、EF Core 10 が 2025年11月に出た。2026年5月の事実上の標準は EF Core 10。

ここ 2-3年の変化:

典型コード:

public class AppDbContext : DbContext
{
    public DbSet<Order> Orders => Set<Order>();

    protected override void OnModelCreating(ModelBuilder mb)
    {
        mb.Entity<Order>(b =>
        {
            b.ToTable("orders");
            b.ComplexProperty(o => o.ShippingAddress);
            b.OwnsMany(o => o.Items);
            b.Property(o => o.Metadata)
                .HasColumnType("jsonb");
        });
    }
}

// 一括削除 - SQL 一発
await db.Orders
    .Where(o => o.Status == OrderStatus.Cancelled && o.CreatedAt < DateTime.UtcNow.AddYears(-1))
    .ExecuteDeleteAsync();

EF Core vs Dapper vs Marten:

ツールモデル強み弱み
EF CoreORM / change tracking豊かな LINQ、マイグレーション、関係複雑クエリは SQL 可読性が落ちる
DapperMicro-ORM速い、SQL を手書きすべて手動
MartenPostgres + Event Sourcingdocument DB + event storePostgres 専用
LinqToDBSQL-shape LINQ性能 + LINQ 表現力学習曲線

2026年の default は EF Core + Dapper の併用 だ。CRUD とドメイン変更は EF Core、重い帳票 / 分析クエリは Dapper。


11章 · MediatR / MassTransit / NServiceBus — CQRS とメッセージング

2024年末、.NET CQRS 界隈が揺れた。MediatR が 8.x から商用ライセンスへ移行 したからだ。同じ作者の AutoMapper も同時期に paid edition を導入。この決定は .NET コミュニティで大きな論争を呼んだ。

現在の選択肢:

ツールモデルライセンス備考
MediatR 8+in-process mediator商用安定。費用発生。
Wolverinein-process + messagingOSS (MIT)Jeremy D. Miller。CQRS + saga 統合。
Brightercommand processorOSS (BSD)メッセージング統合。
自前実装DI + interfacen/a小規模なら十分。

Wolverine 例:

// Handler — interface なしでメソッドシグネチャから認識
public class CreateOrderHandler
{
    public async Task<OrderCreated> Handle(CreateOrder command, AppDbContext db)
    {
        var order = new Order(command.CustomerId, command.Items);
        db.Orders.Add(order);
        await db.SaveChangesAsync();
        return new OrderCreated(order.Id);
    }
}

// 呼び出し
var result = await bus.InvokeAsync<OrderCreated>(new CreateOrder(...));

interface 宣言なしでメソッドシグネチャを解析するのが Wolverine の特徴。MediatR の IRequestHandler ボイラープレートが消える。

メッセージング (out-of-process):

ツールトランスポートライセンス強み
MassTransitRabbitMQ、Azure Service Bus、Kafka などOSS (Apache) → 一部 Pro最も広く使われる
NServiceBus多様商用エンタープライズ。saga が強い。
WolverineRabbitMQ、Kafka、Azure Service BusOSS (MIT)CQRS とメッセージング統合
RebusRabbitMQ、Azure Service Bus などOSS軽量

MassTransit の saga パターン:

public class OrderSaga : MassTransitStateMachine<OrderState>
{
    public State Submitted { get; private set; }
    public State Paid { get; private set; }
    public State Shipped { get; private set; }

    public Event<OrderSubmitted> OnSubmitted { get; private set; }
    public Event<PaymentReceived> OnPaid { get; private set; }

    public OrderSaga()
    {
        InstanceState(x => x.CurrentState);

        Initially(
            When(OnSubmitted)
                .Then(c => c.Saga.OrderId = c.Message.OrderId)
                .TransitionTo(Submitted));

        During(Submitted,
            When(OnPaid)
                .TransitionTo(Paid));
    }
}

2026年の推奨:


12章 · FastEndpoints / Carter / Minimal APIs

ASP.NET Core 10 のルーティングスタイルは三つに分かれた。

1. Minimal APIs (default):

app.MapGet("/orders/{id:guid}", async (Guid id, AppDbContext db) =>
{
    var order = await db.Orders.FindAsync(id);
    return order is null ? Results.NotFound() : Results.Ok(order);
});

長所: 軽量、起動が速い。短所: 大きな API では Program.cs が肥大化。

2. Controllers (伝統):

[ApiController]
[Route("orders")]
public class OrdersController : ControllerBase
{
    [HttpGet("{id:guid}")]
    public async Task<IActionResult> Get(Guid id) { ... }
}

長所: 馴染みがある、クラス単位で整理。短所: ボイラープレートが多い。

3. FastEndpoints / Carter (構造的なミニマル):

FastEndpoints は「Endpoint per class」パターンを強制する。

public class GetOrderEndpoint : Endpoint<GetOrderRequest, OrderResponse>
{
    public AppDbContext Db { get; set; } = null!;

    public override void Configure()
    {
        Get("/orders/{id:guid}");
        AllowAnonymous();
    }

    public override async Task HandleAsync(GetOrderRequest req, CancellationToken ct)
    {
        var order = await Db.Orders.FindAsync([req.Id], ct);
        if (order is null) { await SendNotFoundAsync(ct); return; }
        await SendAsync(new OrderResponse(order), cancellation: ct);
    }
}

Carter は Nancy の精神的後継で、モジュール単位ルーティング。

public class OrdersModule : ICarterModule
{
    public void AddRoutes(IEndpointRouteBuilder app)
    {
        app.MapGet("/orders/{id:guid}", async (Guid id, AppDbContext db) =>
        {
            var order = await db.Orders.FindAsync(id);
            return order is null ? Results.NotFound() : Results.Ok(order);
        });
    }
}

比較:

基準Minimal APIControllersFastEndpointsCarter
ボイラープレート極小多い少ない極小
整理弱い強い強い (per-class)中 (per-module)
性能最速やや遅い最速 (Minimal の上)最速 (Minimal の上)
OpenAPI自動自動自動 + 豊富自動
学習コスト
大規模 API 適性弱い強い強い

推奨: 50 エンドポイント以下は Minimal API、それ以上は FastEndpoints または Controllers。軽くモジュール分割したいなら Carter。


13章 · NativeAOT — 小さな単一実行ファイル

NativeAOT は .NET 7 で GA となり、.NET 9-10 で成熟した。核となる発想は JIT の代わりに ahead-of-time コンパイルで単一のネイティブ実行ファイルを生成する こと。

長所:

制約:

AOT フレンドリーなライブラリ:

AOT 非フレンドリー:

例 — AOT minimal API:

<PropertyGroup>
    <PublishAot>true</PublishAot>
    <InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
dotnet publish -c Release -r linux-x64
# 単一ネイティブ実行ファイル → bin/Release/net10.0/linux-x64/publish/MyApi
# サイズ: 通常 15-25 MB

使うとき:

使わないとき:


14章 · Roslyn analyzers / NuGet / dotnet CLI

Roslyn analyzers:

.NET アナライザはコンパイル時にコード品質・セキュリティ・性能の問題を捕まえる。2026年にはほぼ default で以下を入れる:

.editorconfig でルールを制御:

[*.cs]
dotnet_diagnostic.CA1822.severity = warning   # mark members as static
dotnet_diagnostic.IDE0005.severity = error    # unused using
dotnet_analyzer_diagnostic.category-Style.severity = suggestion

Nullable enforcement:

<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>

この二行がモダン .NET プロジェクトとレガシーの最大の差だ。null 安全性をコンパイラが強制。

NuGet 6 + Central Package Management:

Directory.Packages.props 一つのファイルでソリューション全体のパッケージバージョンを制御:

<Project>
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="MediatR" Version="8.4.0" />
    <PackageVersion Include="EntityFrameworkCore.Sqlite" Version="10.0.0" />
    <PackageVersion Include="Serilog.AspNetCore" Version="8.0.3" />
  </ItemGroup>
</Project>

各 csproj では <PackageReference Include="MediatR" /> のみ、バージョン記述なし。バージョン衝突が消える。

dotnet CLI の統合:

# 2026年の標準ワークフロー
dotnet new aspire-starter -n MyApp        # Aspire ソリューション生成
dotnet add package Serilog.AspNetCore     # パッケージ追加 (CPM 有効時は Directory.Packages.props に記録)
dotnet ef migrations add InitialCreate    # EF Core マイグレーション
dotnet aspire run                         # Aspire アプリ実行
dotnet test --collect:"XPlat Code Coverage" # テスト + カバレッジ
dotnet format                             # 自動フォーマット
dotnet workload install android ios       # MAUI workload
dotnet run app.cs                         # 単一ファイル実行 (.NET 10)

global.json:

ルートに置くとソリューションが使う SDK バージョンを明示できる。

{
  "sdk": {
    "version": "10.0.100",
    "rollForward": "latestFeature"
  }
}

この一ファイルのおかげで、チームメンバごとに SDK バージョンが違うときに起きる微妙なバグが消える。


15章 · 日本 / 韓国 — 任天堂、ソフトバンク、トス

.NET は日本や韓国のテックメディアではあまり目立たないが、実際の enterprise / 金融 / ゲームバックエンドには広く敷かれている。

日本:

韓国:

まとめると: 日本も韓国も、enterprise / 金融 / 通信 / 政府ドメインで .NET は事実上の標準選択肢の一つ。カンファレンスのステージには出にくいが、売上とシステム規模で見ると軽くない。


16章 · 誰が .NET を選ぶべきか

.NET を選ぶべきケース:

.NET を避けるべきケース:

意思決定ツリー (簡略化):

Q1. ドメインは?
├── エンタープライズ / 金融 / 政府 / 保険 / Windows 統合
│   └── .NET 10 + ASP.NET Core 10 + EF Core 10
├── 公開コンシューマ Web / SEO 中心
│   └── Next.js / Remix / SvelteKit を先に検討
├── ゲーム (Unity)
│   └── C# (.NET 互換ランタイム)
└── モバイルアプリ (コンシューマ)
    └── Native または Flutter / RN を先に

Q2. チームの言語は?
├── C# が強い → .NET
├── Java/Kotlin が強い → Spring / Quarkus
├── TS/JS が強い → Node / Deno
└── Python が強い → FastAPI / Django

Q3. デプロイ環境は?
├── Azure / オンプレ Windows → .NET が自然
├── AWS / GCP / K8s → .NET 可、OpenTelemetry · Aspire を活用
└── Vercel / Cloudflare / Edge → .NET は合わない

一行推奨 (2026年5月時点):

最も大事なメタ推奨: .NET を使わないのが合理的なドメインも確かに存在する。だが、自分がそのドメインにいると断定する前に、一度はモダン .NET がどこまで来たか自分で計測してみる価値がある。2026年の .NET は 2018年の .NET とほとんど別の道具だ。


参考 / References

コメント

まだコメントはありません。

ログインするとコメントできます