필사 모드: モダン .NET 2026 完全ガイド - .NET 9 · C# 13 · F# 9 · ASP.NET Core · Blazor United · MAUI · Aspire · EF Core 9 徹底解説
日本語プロローグ — 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` パラメータが配列だけを受けるのをやめた。`IEnumerable`・`Span`・`ReadOnlySpan`・任意のコレクション型を受ける。
// 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
@code {
private int currentCount = 0;
private void IncrementCount() => currentCount++;
}
`@rendermode` を `InteractiveServer`・`InteractiveWebAssembly`・`InteractiveAuto` に切り替えると、同じコンポーネントが別の環境で動く。`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 ページ。
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.MainPage">
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 で作っている。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="HelloAvalonia.MainWindow"
Title="HelloAvalonia">
**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 を商用化すると発表し、コミュニティの一部がフォークを作った(例:`Brighter`・`Mediator.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` による中央集権バージョン管理:
各プロジェクトはバージョンなしで `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.Analyzers`・`Microsoft.CodeAnalysis.NetAnalyzers` が代表例。
dotnet add package Microsoft.CodeAnalysis.NetAnalyzers
ビルド時に数百のルールが自動適用される。`.editorconfig` の `dotnet_diagnostic.CA1822.severity = error` といった行で個別調整する。
**ソースジェネレータ(Source Generator)** — コンパイル時にコードを生成する。AOT フレンドリーで、リフレクションの代替。
代表例:
- **System.Text.Json** — `JsonSerializerContext` ソースジェネレータで 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
- **.NET 公式サイト** — https://dot.net/
- **Microsoft Learn .NET** — https://learn.microsoft.com/dotnet/
- **.NET 10 announcement** — https://devblogs.microsoft.com/dotnet/announcing-dotnet-10/
- **.NET 9 announcement** — https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/
- **C# 13 features** — https://learn.microsoft.com/dotnet/csharp/whats-new/csharp-13
- **C# language design** — https://github.com/dotnet/csharplang
- **F# language design** — https://github.com/fsharp/fslang-design
- **ASP.NET Core docs** — https://learn.microsoft.com/aspnet/core/
- **Blazor docs** — https://learn.microsoft.com/aspnet/core/blazor/
- **.NET MAUI** — https://learn.microsoft.com/dotnet/maui/
- **.NET Aspire** — https://learn.microsoft.com/dotnet/aspire/
- **Entity Framework Core** — https://learn.microsoft.com/ef/core/
- **Orleans** — https://learn.microsoft.com/dotnet/orleans/
- **Avalonia UI** — https://avaloniaui.net/
- **Uno Platform** — https://platform.uno/
- **Unity** — https://unity.com/
- **Godot** — https://godotengine.org/
- **Stride engine** — https://www.stride3d.net/
- **xUnit** — https://xunit.net/
- **NuGet** — https://www.nuget.org/
- **BenchmarkDotNet** — https://benchmarkdotnet.org/
- **.NET runtime repo** — https://github.com/dotnet/runtime
- **.NET デブコミュニティコリア** — https://www.facebook.com/groups/dotnetdev/
- **.NETラボ勉強会** — https://dotnetlab.connpass.com/
— 完 —
현재 단락 (1/580)
2010年代までの .NET の見られ方はシンプルだった。**「Windows Server に IIS を入れて C# を書く Microsoft スタック」**。行き先は「Java のライセンスを...