57 人が閲覧(直近 30 日) C# / .NET

.NET 10(LTS)とは?SDKの選び方と入手・サポート期限・C# 14と移行を解説

.NET 10(LTS)とは?SDKの選び方と入手・サポート期限・C# 14と移行を解説

.NET 10 は 2025年11月11日に公開された LTS(長期サポート)版で、サポートは 2028年11月14日まで続きます。2026年10月13日時点の最新は ランタイム 10.0.13 で、SDK は 10.0.402 と 10.0.113 の2本が同時に配布されています。この記事では、2本の SDK のどちらを入れるか、OS 別の入れ方、Visual Studio 2022 で使えるか、C# 14 で何が書けるか、.NET 8/9 からいつ上げるかを、公式のリリースデータと手元での実行結果をもとに説明します。

まとめ:.NET 10 LTSとSDKの要点

  • サポート期限:.NET 10 は LTS で 2028年11月14日まで。.NET 8 と .NET 9 はどちらも 2026年11月10日に終わるため、移行先は .NET 10 になります。
  • 入れる SDK:Visual Studio 2026 や普段の開発では最新の帯の 10.0.4xx(現在 10.0.402)。10.0.1xx は Ubuntu などの Linux ディストリビューションのパッケージ向けで、延長期間の修正は Linux 向けに限られます。
  • SDK とランタイム:開発機には SDK、フレームワーク依存で配布したアプリを動かすサーバーには用途に合うランタイム(.NET/ASP.NET Core/デスクトップ)を入れます。
  • Visual Studio 2022:net10.0 のターゲットは Visual Studio 18.0(2026)以降でのみ公式サポートです。2022 で開くこと自体はできても、サポート外です。
  • C# 14:拡張メンバー、field キーワード、null 条件付き代入などが使えます。ただし net9.0 のままでは C# 13 扱いになり、C# 14 の構文はエラーになります。

.NET 10のサポート期限とLTSの決まり方

.NET は毎年11月にメジャー版を出し、偶数番が LTS、奇数番が STS(標準期間サポート)です。Microsoft の.NET のリリースとサポートでは、LTS は最低3年(次の LTS の公開から1年後のほうが遅ければそこまで)、STS は2年と定めています。STS はもともと18か月でしたが、2025年9月16日の .NET Blog で .NET 9 から24か月に延びました。その結果、.NET 8 と .NET 9 の終了日が同じ日になっています。

2028年11月14日のサポート期限と各版の終了日

Microsoft が配布しているリリースデータ releases-index.json と、GitHub の dotnet/core の .NET 10 リリースノートでは、.NET 10 の終了日は2028年11月14日です(逐語は「from November 11, 2025 to November 14, 2028」)。「2028年11月10日」と書いている記事もありますが、これは誤りです。2026年10月18日時点の各版の状態は次のとおりです。

版 種別 状態 最新パッチ サポート終了
.NET 11 STS RC2(go-live) 11.0.0-rc.2 2028年11月9日(予定)
.NET 10 LTS active 10.0.13 2028年11月14日
.NET 9 STS maintenance 9.0.21 2026年11月10日
.NET 8 LTS maintenance 8.0.32 2026年11月10日

maintenance は終了前の最後の6か月を指し、セキュリティ修正だけが出ます。パッチは原則毎月で、セキュリティ修正を含む月は第2火曜日に出ます。月ごとの修正内容や CVE はCVE-2026-40372とは?.NET 10.0.7で修正されたASP.NET Core権限昇格の影響範囲と対応手順で扱っています。

.NET 10 SDKとランタイムの違いと導入先

SDK はコンパイラと dotnet CLI を含む開発用の一式で、ランタイムも同梱しています。ランタイムはビルド済みのアプリを動かすためだけのもので、アプリの種類ごとに3つに分かれます。

コンポーネント 入れる場所 対応 OS
.NET SDK 開発機・CI Windows/macOS/Linux
.NET Runtime コンソール・Worker の実行先 Windows/macOS/Linux
ASP.NET Core Runtime Web アプリの実行先 Windows/macOS/Linux
.NET Desktop Runtime WPF・WinForms の実行先 Windows のみ
Hosting Bundle IIS で ASP.NET Core を動かすサーバー Windows のみ

ダウンロードページの説明では、Desktop Runtime は .NET Runtime を含みますが、Windows の ASP.NET Core Runtime は単体では足りず、.NET Runtime と IIS サポートを含む Hosting Bundle を勧めています。ランタイムが要るのはフレームワーク依存で発行したアプリだけで、自己完結型(--self-contained)で発行したアプリはランタイムを同梱するので実行先に入れる必要はありません。WPF アプリの配布で Desktop Runtime を求められる理由はWPFとは?2026年も現役か・WinFormsやWinUI 3との違いと.NET 10での使い方で説明しています。

.NET 10 SDKの版番号:10.0.402と10.0.113の選定基準

.NET 10.0 のダウンロードページには、同じ日付の SDK が2本並んでいます。説明は付いていませんが、これは「フィーチャーバンド」の違いです。

フィーチャーバンドの読み方と寿命

SDK の版番号 10.0.402 は、3つ目の数の百の位(4)がフィーチャーバンド、下2桁(02)がその帯のパッチ番号です。帯はおおむね四半期ごとに1つ上がり、Visual Studio の版と組みになっています。SDK と Visual Studio のバージョン対応表に載っている .NET 10 の帯は次の4つです。

帯 組になる Visual Studio 公開 サポート終了 2026年10月の最新
10.0.1xx 18.0 2025年11月 2028年11月 10.0.113
10.0.2xx 18.4 2026年3月 2026年5月 終了(10.0.204)
10.0.3xx 18.6 2026年5月 2026年8月 終了(10.0.303)
10.0.4xx 18.9 2026年8月 2028年11月 10.0.402

中間の 2xx と 3xx は次の帯が出ると数か月で終わり、最初の 1xx と最後の 4xx だけがランタイムと同じ2028年11月まで続きます。1xx が長く残るのは、Linux ディストリビューションがソースからビルドする(source-build)ためで、対応表の注記では延長期間の修正は Linux 向けのセキュリティ修正などに限られるとしています。2026年10月の SDK 10.0.402 は Visual Studio 18.10.4 と 18.11.0 に同梱されていると、リリースデータに書かれています。

選び方は次のとおりです。

  • 10.0.4xx を入れる:Visual Studio 2026 や VS Code で開発する機、新しい SDK 機能(ファイルベースアプリの改善など)を使う CI。最新の帯は下位の TFM もビルドできるので、迷ったらこちらです。
  • 10.0.1xx を入れる:Ubuntu などの Linux で、ディストリビューションの標準パッケージに揃える環境。延長期間の修正は Linux 向けのセキュリティ修正などに限られ、帯を固定しても毎月のパッチ適用は続けます。Windows や macOS で長期固定のために 1xx を選ぶ理由はありません。
  • 2xx・3xx は新しく入れない:すでにサポートが終わっており、セキュリティ修正が出ません。global.json で 10.0.3xx に固定しているリポジトリは見直しが必要です。

global.jsonによるSDK選択とロールフォワードの実測

1台に複数の SDK がある場合、何も指定しなければ最新(ここでは 10.0.402)が使われます。リポジトリ直下の global.json で、使う版と繰り上げの範囲を指定できます。10.0.402 と 10.0.113 の2本を入れた macOS で dotnet --version の結果を確かめました。

{
  "sdk": {
    "version": "10.0.400",
    "rollForward": "latestFeature"
  }
}
global.json の指定 選ばれた SDK
指定なし 10.0.402
version 10.0.100(rollForward 省略) 10.0.113
version 10.0.300(rollForward 省略) エラー
version 10.0.300・latestFeature 10.0.402
version 10.0.113・disable 10.0.113

global.json の公式解説のとおり、rollForward を省略すると既定は patch で、同じ帯の中でしか繰り上がりません。10.0.300 を指定したリポジトリは、3xx の SDK が入っていない機械では「A compatible .NET SDK was not found.」で止まります。3xx はサポートが終わって新しいパッチが出ないので、指定を 10.0.400 に上げるか、帯をまたいで新しい SDK を許す latestFeature を書きます。

.NET 10 SDKをインストールする手順(Windows・macOS・Linux)

Windows と macOS はダウンロードページのインストーラーで、Linux はディストリビューションのパッケージかバイナリで入ります。下の winget・apt・--channel はその時点の最新を入れるだけなので、パッチ版まで揃えるなら dotnet-install スクリプトの --version で明示します。

WindowsへのwingetによるSDK導入

Windows へのインストール手順に載っているパッケージ ID は次のとおりです。ランタイムだけなら Microsoft.DotNet.Runtime.10、Microsoft.DotNet.AspNetCore.10、Microsoft.DotNet.DesktopRuntime.10 を指定します。

winget install Microsoft.DotNet.SDK.10

macOS・CIでのdotnet-installスクリプトによる版指定

macOS の開発機は pkg インストーラーで入れるのが基本です。CI や一時的な環境では、管理者権限なしで入る公式スクリプトが使えます。--channel 10.0 は最新の帯、--version は版の指定です。

curl -sSL https://dot.net/v1/dotnet-install.sh -o dotnet-install.sh
bash dotnet-install.sh --channel 10.0 --install-dir "$HOME/.dotnet"
bash dotnet-install.sh --version 10.0.113 --install-dir "$HOME/.dotnet"
export DOTNET_ROOT="$HOME/.dotnet"
export PATH="$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools"

2本の dotnet-install.sh で 10.0.402 と 10.0.113 が同じフォルダーに並び、ランタイム 10.0.13 は1つだけ入りました。bash で実行したスクリプトは呼び出し元のシェルの PATH を変えず、DOTNET_ROOT も設定しないので、最後の2行を実行します。続けて使うならシェルの設定ファイル(~/.zshrc など)にも書きます。スクリプトは依存ライブラリを入れないので、Linux で使うときは OS の依存パッケージを別に入れます。

Ubuntuのapt配布SDKと1xx帯の更新状況

Ubuntu 24.04 以降は Ubuntu 自身のリポジトリに .NET 10 があり、Ubuntu へのインストール手順では Microsoft のリポジトリにはもう Ubuntu 向けの .NET パッケージが無いとしています。

sudo apt-get update
sudo apt-get install -y dotnet-sdk-10.0
# 実行だけなら aspnetcore-runtime-10.0 か dotnet-runtime-10.0

ここで入るのは 1xx 帯です。Launchpad の dotnet10 パッケージでは、2026年10月18日時点で 24.04(noble)の updates は 10.0.112-10.0.12(SDK 10.0.112・ランタイム 10.0.12)で、10月13日に出た 10.0.13 はまだ届いていません。9月の 10.0.12 は Microsoft の公開(9月8日)の翌日に届きましたが、10月分は5日たっても届いておらず、反映の速さは月によって違います。パッチの適用日が決まっている運用では、dotnet --list-runtimes で版を確かめてから進めます。

インストール後の確認とnet10.0への切り替え

dotnet --list-sdks
dotnet --list-runtimes
dotnet sdk check

dotnet sdk check は入っている SDK とランタイムが最新かを一覧にします。既存のプロジェクトは .csproj の <TargetFramework>net10.0</TargetFramework> に書き換えます。dotnet new console で作ったプロジェクトは最初から net10.0 でした。

Visual Studio 2022での.NET 10の対応範囲

公式サポートの範囲では使えません。SDK と Visual Studio の対応表には「Targeting net10.0 is officially supported in Visual Studio 18.0+ only.」とあり、18.0 は Visual Studio 2026 です。細かく見ると次のとおりです。

  • SDK 10.0.100(1xx)は Visual Studio 17.14(2022 の最終系)でも読み込めますが、17.14 で扱える TFM の上限は net9.0 です。
  • 10.0.200 以降の SDK は最低 Visual Studio 18.0 が必要です。
  • 新しい SDK を古い Visual Studio で使うこと自体は止められませんが、新しいランタイムをターゲットにするとサポート外で、ビルド時に警告が出ます。
  • Visual Studio 用 .NET SDK の一覧でも、.NET 10.0 の「Visual Studio 2022 SDK」欄は「該当なし」です。

Visual Studio 2022 を残す場合は、.NET 10 のプロジェクトだけ dotnet CLI か VS Code の C# Dev Kit で扱うのが現実的です。Visual Studio 2026 の変更点とサポート期限はVisual Studio 2026の新機能|VS2022との違い・サポート期限とVS2027への更新【2026年10月】にまとめています。

.NET 10の主な新機能:ランタイム・ライブラリ・SDK

ランタイム:JITの最適化とスタック割り当て

.NET 10 ランタイムの新機能の中心は JIT です。配列のインターフェイスメソッドの非仮想化とインライン展開、構造体引数のコード生成、ループ反転が改善されました。値型と参照型の小さな配列と、構造体のフィールドが参照するオブジェクトも、JIT のエスケープ解析でメソッドの外へ出ないと判断されればスタックに置かれます。ラムダ式のデリゲート(Func オブジェクト)自身もスタックに置かれるようになりましたが、変数を捕捉したクロージャーのオブジェクトはヒープに残ります。Arm64 では書き込みバリアの既定が変わり、GC の一時停止が8%から20%超短くなったというベンチマークが示されています。AVX10.2 の組み込み関数も入りましたが、対応 CPU がまだ無いため JIT 側の対応は既定で無効です。実際に割り当てがどれだけ減るかはC#のボックス化とは?の .NET 10 での計測が参考になります。

ライブラリ:耐量子暗号・JSON・WebSocketStream

.NET 10 ライブラリの新機能では、耐量子暗号の ML-KEM・ML-DSA・SLH-DSA が型として入りました。使えるのは OS の暗号ライブラリが OpenSSL 3.5 以降か、PQC に対応した Windows CNG の場合だけです。macOS 26.6 で MLKem.IsSupported・MLDsa.IsSupported・SlhDsa.IsSupported を表示すると、3つとも False でした。macOS で動くアプリは、PQC が使えない前提で分岐を書く必要があります。SDK 10.0.402 でビルドすると、MLDsa と MLKem は警告なしで通り、SlhDsa と CompositeMLDsa は「error SYSLIB5006」(評価用の API)で止まりました。この2つを試すときは #pragma warning disable SYSLIB5006 で抑制します。

JSON は AllowDuplicateProperties = false で重複したプロパティを拒否でき、PipeReader から直接デシリアライズできるようになりました。WebSocket を Stream として読み書きする WebSocketStream も追加されています。macOS のクライアント側 TLS 1.3 も使えるようになりましたが、DOTNET_SYSTEM_NET_SECURITY_USENETWORKFRAMEWORK=1 などでオプトインしないと有効になりません。

SDK:ファイルベースアプリとdnx

.NET 10 SDK では、プロジェクトファイルを作らずに1つの .cs ファイルを実行できます。#:package で NuGet パッケージも指定できます。

#:package [email protected]
using Humanizer;
System.Console.WriteLine(System.TimeSpan.FromMinutes(90).Humanize(2));
System.Console.WriteLine(System.Environment.Version);

dotnet run hello.cs を実行すると、パッケージの復元のあとに「1 時間, 30 分」と「10.0.13」が表示されました。フォルダーには hello.cs しか残らず、ビルド結果はユーザーのキャッシュ領域に置かれます。育ってきたら dotnet project convert で通常のプロジェクトに変換できます。

ほかに、ツールをインストールせずに実行する dnx(dotnet tool exec の短縮形)、dotnet publish /t:PublishContainer でコンソールアプリからコンテナイメージを作る機能、global.json で有効にする dotnet test の Microsoft.Testing.Platform 対応が入りました(.NET 10 SDK の新機能)。

C# 14の新機能:.NET 10で書ける構文と実行結果

C# 14 の新機能のうち、よく使う4つを1つのファイルにまとめて SDK 10.0.402 で実行しました。

var nums = new List<int?> { 1, null, 3 };
Console.WriteLine($"IsEmpty={nums.IsEmpty} NonNull={string.Join(",", nums.WhereNotNull())}");
Console.WriteLine($"Empty={IEnumerable<int>.Empty.IsEmpty}");

Person? none = null;
none?.Name = Load("none");   // none が null なので右辺は評価されない
Person? some = new Person();
some?.Name = Load("some");
Console.WriteLine(nameof(List<>));

static string Load(string s) { Console.WriteLine($"Load({s})"); return s; }

public class Person
{
    public string Name
    {
        get;
        set => field = value ?? throw new ArgumentNullException(nameof(value));
    } = "";
}

public static class EnumerableExtensions
{
    extension<T>(IEnumerable<T> source)
    {
        public bool IsEmpty => !source.Any();
    }
    extension<T>(IEnumerable<T?> source) where T : struct
    {
        public IEnumerable<T> WhereNotNull() => source.Where(x => x.HasValue).Select(x => x!.Value);
    }
    extension<T>(IEnumerable<T>)
    {
        public static IEnumerable<T> Empty => Enumerable.Empty<T>();
    }
}
IsEmpty=False NonNull=1,3
Empty=True
Load(some)
List

拡張メンバーとfieldキーワード

extension ブロックは、レシーバーを1回だけ書いて中にプロパティやメソッドを並べます。従来の this 付き引数は使いません。レシーバーを型だけにしたブロック(extension<T>(IEnumerable<T>))では静的メンバーを足せるので、IEnumerable<int>.Empty のように型名から呼べます。field はプロパティの自動生成フィールドを指し、null を拒否するセッターを専用フィールドなしで書けます。クラスに field という名前のメンバーがあると意味が変わるので、その場合は @field か this.field と書き分けます。

null条件付き代入とnameofの拡張

?. を代入の左辺に書けるようになり、左辺が null のときは右辺が評価されません。上の結果で Load(none) が出ていないのがその証拠です。+= は書けますが、c?.Value++; はエラー CS1059 になりました。nameof(List<>) のように型引数を省いたジェネリック型も渡せます。ほかに、Span と配列の暗黙変換、型を書かないラムダ引数への ref・out、コンストラクターとイベントの partial(詳しくはC#のpartialとは?partial classの使いどころと部分メソッド・部分プロパティの書き方【C# 14対応】)、ユーザー定義の複合代入演算子が加わりました。

net9.0ターゲットでの言語バージョンとCS9260

SDK を 10 にしても、プロジェクトの TFM が net9.0 のままだと言語バージョンの既定は C# 13 です。同じ SDK 10.0.402 で TFM だけ net9.0 に戻すと、field を使った行で次のエラーになりました。

error CS9260: Feature 'field keyword' is not available in C# 13.0. Please use language version 14.0 or greater.

C# 14 を使うなら TFM を net10.0 に上げます。LangVersion を手で 14 にして古い TFM で使う方法もありますが、新しいランタイムを前提にした機能があるため、サポートされた構成ではありません。

.NET 8・9から.NET 10へ移行する判断と手順

.NET 8 か .NET 9 で動いているシステムは、2026年11月10日を過ぎるとセキュリティ修正が出なくなります。アプリはそのまま動き続けますが、脆弱性が公表されても直らない状態になるので、外部に公開しているシステムは期限内に .NET 10 へ上げるべきです。.NET 11 は2026年10月13日に RC2 が出た段階で、dotnet/core の .NET 11 リリースノートでは STS として2026年11月10日から2028年11月9日までの予定です。終了は .NET 10 より5日早いだけですが、11月10日の時点では正式版が出たばかりです。11か月分のパッチが積まれた .NET 10 のほうが、期限に間に合わせる移行先として確実です(変更点は.NET 11の新機能とリリース日|サポート期限・C# 15・.NET 10との挙動差を実測【RC1】)。次の LTS は .NET 12 です。

急がなくてよいのは、社内だけで動き、外部の入力を受けないツールです。依存する NuGet パッケージやサードパーティ製ライブラリが .NET 10 に対応していない場合も、対応版を待つことになります。ただし期限後の .NET 8/9 は修正が出ないので、待つ期間はできるだけ短くします。

手順は次の順に進めると、どこで壊れたかを切り分けやすくなります。

  1. 開発機と CI に SDK 10.0.4xx を入れ、global.json があれば帯の指定を見直す。
  2. TFM を net10.0 に変え、NuGet パッケージを .NET 10 対応版に更新する。
  3. Microsoft Learn の「.NET 10 の破壊的変更」で、使っている API や設定が載っていないか確かめる。
  4. テストを通したあと、実行環境のランタイムを 10.0 の最新パッチにしてから切り替える。

複数のシステムを期限までに上げる体制が社内に無い場合は、保守運用・内製化支援で移行と移行後のパッチ運用をまとめて相談できます。Web アプリで Blazor を使うかどうかも合わせて決めるなら、Blazorの将来性は?2026年の採用判断と.NET 10時代のWeb開発を解説も参考になります。

よくある質問

.NET 10とは何ですか?

2025年11月11日に公開された .NET のメジャー版で、ランタイム・標準ライブラリ・SDK・C# 14 をまとめた開発と実行の基盤です。Windows・macOS・Linux で動き、偶数番なので LTS として提供されます。

.NET 10のサポート期限はいつまでですか?

2028年11月14日までです。Microsoft のリリースデータと dotnet/core のリリースノートがこの日付です。.NET 8 と .NET 9 は2026年11月10日に終わります。

.NET 10 SDKは10.0.4xxと10.0.1xxのどちらを入れればよいですか?

Visual Studio 2026 や普段の開発、CI では最新の帯の 10.0.4xx(2026年10月時点で 10.0.402)を入れます。10.0.1xx は Ubuntu などの Linux で標準パッケージに揃える環境向けで、延長期間の修正は Linux 向けに限られます。どちらの帯でも毎月のパッチ適用は必要です。2xx と 3xx はサポートが終わっています。

.NET 10のランタイムだけを入れるにはどうすればよいですか?

アプリの種類に合わせて選びます。Web アプリは ASP.NET Core Runtime、WPF・WinForms は .NET Desktop Runtime、それ以外は .NET Runtime です。Windows なら winget install Microsoft.DotNet.AspNetCore.10 のように指定し、Ubuntu なら aspnetcore-runtime-10.0 か dotnet-runtime-10.0 を apt で入れます。

Visual Studio 2022で.NET 10は使えますか?

公式にはサポートされません。net10.0 のターゲットは Visual Studio 18.0(2026)以降のみが対象で、SDK 10.0.200 以降は Visual Studio 18.0 以上を必要とします。Visual Studio 2022 を残す場合は、.NET 10 のプロジェクトを dotnet CLI か VS Code で扱います。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

ほか 8 件の記事からもリンクされています。

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.23 テックブログ Renta!不正アクセスでサービス停止:再開未定の現状と運営側の停止判断・証拠保全・段階的再開
  2. 2026.10.21 テックブログ ふるさとチョイス不正アクセスで445万件流出:対象確認・パスワード変更と再開時期
  3. 2026.10.24 テックブログ カプコン不正アクセス:CAPCOM ID 1,177万件漏えいと196件の乗っ取りへの対処
  4. 2026.10.24 テックブログ ブラストメール不正アクセス:配信先288件の漏えいと利用企業の報告・通知の手順
  5. 2026.10.14 テックブログ ローソンID不正アクセス:215万件漏えいの対象確認と本物メールの見分け方

RELATED POSTS 関連記事

目次