dotnet-version-detection について
.NET のバージョン情報をプロジェクトファイルから検出し、解決したターゲットフレームワークと SDK に応じたガイダンスを示すスキルです。他の .NET 開発スキルより先に実行し、優先順位に沿って設定を調べ、言語バージョンやプレビュー設定も確認します。
主な機能
- 01プロジェクトファイルからターゲットフレームワークを解決
- 02global.json と SDK をフォールバックに使用
- 03C# 言語設定とプレビュー設定の確認
- 04ターゲットフレームワークと SDK の不一致を通知
- 05プロジェクトごとの検出結果のキャッシュ
活用シーン
- 01既存の .NET プロジェクトに適したガイダンスの選択
- 02SDK とターゲットフレームワークの整合性確認
- 03C# 設定やプレビュー機能設定の特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wshaddix/ dotnet-skills --skill dotnet-version-detectionインストール後、Claude Code で/dotnet-version-detectionを入力して読み込まれたか確認します。
詳細
dotnet-version-detection
プロジェクトファイルから .NET のバージョン情報を検出し、バージョンに応じたガイダンスを提供します。このスキルは、.NET の開発作業を始める前に最初に実行されます。他のすべてのスキルは、検出されたバージョンに基づいてガイダンスを調整します。
[skill:dotnet-advisor] およびほぼすべての専門スキルから参照される、複数の分野にまたがるスキルです。.csproj なしで実行できる .NET 10 以降のファイルベースアプリについては、[skill:dotnet-file-based-apps] も参照してください。
検出の優先順位アルゴリズム
プロジェクトファイルを、以下の厳密な順序で読み込みます。番号が大きい情報源ほど優先順位が低くなります。 TFM が確定した時点で、以降の確認は行いません。
1. .csproj の直接の <TargetFramework>(最優先)
現在の作業ファイル/ディレクトリに最も近い .csproj ファイルを読み込みます。
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
値がリテラル TFM(例:$(SomeProperty) ではなく net10.0)であれば、これを確定 TFM とします。値を報告し、追加検出(ステップ 5)に進みます。
値が MSBuild プロパティ式($( で始まる)の場合は、未解決のプロパティを処理するためステップ 4に進みます。
2. .csproj の <TargetFrameworks>(マルチターゲット)
<PropertyGroup>
<TargetFrameworks>net8.0;net10.0</TargetFrameworks>
</PropertyGroup>
見つかった場合:
- すべての TFM を報告します(セミコロン区切り)。
- 最も高い TFM(例:net10.0)に基づいてガイダンスを提供します。
- 低い TFM で必要となるポリフィルについて記載します:「言語機能を net8.0 にバックポートするため、PolySharp/Polyfill については [skill:dotnet-multi-targeting] を検討してください」
- 追加検出(ステップ 5)に進みます。
3. 共通 TFM を指定する Directory.Build.props
.csproj に <TargetFramework> または <TargetFrameworks> が見つからない場合(または .csproj が共通の props から継承している場合)は、現在のディレクトリ、またはソリューションルートまでの親ディレクトリにある Directory.Build.props を読み込みます。
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
見つかった場合は、これを TFM として使用します。注:プロジェクトごとの .csproj の値は Directory.Build.props より優先されます。
4. MSBuild プロパティ式(警告を伴うフォールバック)
TFM の値がリテラルではなく、MSBuild プロパティ式の場合:
<TargetFramework>$(MyCustomTfm)</TargetFramework>
次の警告を出力します。
警告:MSBuild プロパティ
$(MyCustomTfm)を解決できません。 TFM を静的に特定できません。global.jsonの SDK バージョンにフォールバックします。
その後、global.json の SDK バージョン(ステップ 4a)、または dotnet --version(ステップ 4b)に進みます。
4a. global.json の SDK バージョン
{
"sdk": {
"version": "10.0.100"
}
}
SDK バージョンをおおよその TFM に対応付けます。
8.0.xxx→ net8.09.0.xxx→ net9.010.0.xxx→ net10.011.0.xxx-preview.x→ net11.0
次のように報告します:「global.json の SDK バージョンから TFM を推定しました。プロジェクトファイルで実際の TFM を確認してください。」
4b. dotnet --version(最後の手段)
global.json が存在しない場合は、dotnet --version の出力から SDK バージョンを推定します。対応付けは 4a と同じです。
次のように報告します:「インストール済みの SDK バージョンから TFM を推定しました。global.json と .csproj が見つかりません。dotnet new でプロジェクトを作成することを検討してください。」
追加検出(ステップ 5)
TFM の確定後、補足的なバージョン情報を得るため、以下のファイルも確認します。どの優先順位ステップで TFM が確定した場合でも、必ずこれらの確認を実行してください。
5a. global.json の SDK バージョン
TFM が .csproj から確定している場合でも、global.json を読み込み、次の項目を確認します。
sdk.version— 固定された SDK バージョンsdk.rollForward— rollForward ポリシー(例:latestFeature、latestPatch)
SDK バージョンを TFM と併せて報告します。不整合がある場合は警告します。
警告:TFM は
net10.0ですが、global.jsonでは SDK9.0.100が固定されています。 プロジェクトのターゲット フレームワークが、固定された SDK より新しいバージョンです。global.jsonを更新するか、ビルド環境に適切な SDK があることを確認してください。
5b. C# 言語バージョン
.csproj または Directory.Build.props に明示的な <LangVersion> があるか確認します。
<LangVersion>preview</LangVersion>
previewの場合 — 「C# プレビュー機能が有効です。インストール済み SDK で利用可能な次の C# バージョンが使用できます(例:.NET 11 プレビュー SDK で C# 15 のプレビュー機能を使用)。」と報告します。latestの場合 — 検出された TFM の既定の C# バージョンを報告します。- 明示的なバージョン(例:
12.0)の場合 — そのバージョンを報告し、TFM の既定値より低ければ警告します。 - 指定がない場合 — TFM の既定の C# バージョンを使用します(以下の参照データを参照)。
5c. プレビュー機能の検出
.csproj または Directory.Build.props で次のプロパティを確認します。
EnablePreviewFeatures:
<EnablePreviewFeatures>true</EnablePreviewFeatures>
報告:「.NET のプレビュー機能が有効です。プレビュー API と型を利用できます。」
Runtime-async 機能フラグ(.NET 11 以降):
<Features>$(Features);runtime-async=on</Features>
報告:「Runtime-async が有効です。async/await はコンパイラーのステートマシンではなく、ランタイムレベルの実行を使用します。」
注:Runtime-async を使用するには、<EnablePreviewFeatures>true</EnablePreviewFeatures> も必要です。
5d. マルチターゲティングの詳細
マルチターゲティングが検出された場合(ステップ 2)、次の点も記載します。
- どの TFM が LTS、STS、プレビューに該当するか
- サポート終了が近づいている TFM
- ポリフィルのガイダンスとして [skill:dotnet-multi-targeting] を提案する
構造化出力形式
検出後、次の構造化形式で結果を提示します。
.NET Version Detection Results
==============================
TFM: net10.0 (or net8.0;net10.0 for multi-targeting)
Highest TFM: net10.0
C# Version: 14 (default for net10.0)
SDK Version: 10.0.100 (from global.json)
Preview Features: none
Runtime-Async: not enabled
Warnings: none
Guidance: This project targets .NET 10 LTS with C# 14. Use modern patterns
including field-backed properties, collection expressions, and primary
constructors. All guidance will target net10.0 capabilities.
マルチターゲティングの場合:
.NET Version Detection Results
==============================
TFMs: net8.0;net10.0
Highest TFM: net10.0
C# Version: 14 (default for highest TFM)
SDK Version: 10.0.100 (from global.json)
Preview Features: none
Warnings: net8.0 reaches end of support Nov 2026
Guidance: Multi-targeting net8.0 and net10.0. Guide on net10.0 patterns.
For net8.0 compatibility, use PolySharp/Polyfill for language features.
See [skill:dotnet-multi-targeting] for detailed polyfill guidance.
エッジケース
.csproj が見つからない場合
ワークスペースに .csproj が存在しない場合:
.slnまたは.slnxファイルを確認し、参照されているプロジェクトを調べます- プロジェクトファイルが見つからない場合は、次のフォールバック手順に進みます。
global.jsonから SDK バージョンを読み取り(ステップ 4a)、TFM を推定しますglobal.jsonがない場合は、dotnet --version(ステップ 4b)を使用して TFM を推定します- どちらの推定方法も失敗した場合に限り:「.NET プロジェクトまたは SDK が検出されませんでした。現在の LTS である net10.0 をガイダンスの既定値として使用します。
dotnet newを使用してプロジェクトを作成してください。」
MSBuild プロパティの間接参照
<TargetFramework> に $(PropertyName) が含まれている場合:
- 「未解決のプロパティ:
$(PropertyName)。 静的解析では TFM を特定できません。」と出力します global.jsonの SDK バージョン、次にdotnet --versionを使用してフォールバックしますdotnet --list-sdksまたはdotnet msbuild -getProperty:TargetFrameworkで TFM を確認するよう推奨します
ファイル間の不整合
.csproj に net10.0 と記載されている一方、global.json で SDK 9.0.100 が固定されている場合:
- 優先度の高い .csproj の TFM を優先します
- 不一致について警告します
global.jsonを一致するよう更新することを提案します
SDK がインストールされていない場合
dotnet --version が失敗するか、見つからない場合:
- 「このシステムで .NET SDK が検出されませんでした。https://dot.net からインストールしてください」と報告します
- プロジェクトファイルが存在する場合は、引き続きプロジェクトファイルから TFM を報告します
- SDK がないとビルドに失敗することを記載します
.fsproj と .vbproj
同じ検出ロジックが F#(.fsproj)および VB.NET(.vbproj)のプロジェクトにも適用されます。<TargetFramework> 要素は、すべての .NET プロジェクトの種類で共通です。
キャッシュ動作
バージョン検出結果は、プロジェクトごと(.csproj のパスごと)にキャッシュします。次の場合は再検出します。
- ユーザーがソリューション内の別のプロジェクトに切り替えた場合
- ユーザーが明示的に再検出を要求した場合
.csproj、Directory.Build.props、またはglobal.jsonファイルが変更された場合
バージョンと機能の参照データ
最終更新日:2026-02-11
この参照データでは、.NET のバージョンを C# の言語バージョン、主な機能、サポートライフサイクルに対応付けます。このセクションは上記の検出ロジックとは別のものです。検出によって使用中のバージョンを特定し、このデータによってそのバージョンで利用可能な機能を示します。
バージョン一覧
| .NET Version | Status | C# Version | TFM | Support End | Notes |
|---|---|---|---|---|---|
| .NET 8 | LTS (アクティブ) | C# 12 | net8.0 | 2026年11月 | サポート終了が近づいています |
| .NET 9 | STS | C# 13 | net9.0 | 2026年5月 | サポート終了が近づいています |
| .NET 10 | LTS (現行) | C# 14 | net10.0 | 2028年11月 | 新しいプロジェクトに推奨 |
| .NET 11 | Preview 1 | C# 15 (プレビュー) | net11.0 | 未定(2026年11月 GA の場合、STS の終了は 2028年5月頃の見込み) | プレビューのみ。本番環境では使用しないでください |
C# バージョンごとの主な機能
C# 12 (net8.0)
- クラス/構造体のプライマリコンストラクター
- コレクション式(
[1, 2, 3]) ref readonlyパラメーター- ラムダ式の既定パラメーター
usingによる任意の型のエイリアス- インライン配列
- インターセプター(試験的)
C# 13 (net9.0)
paramsコレクション(任意のコレクション型)Lock型(System.Threading.Lock)- 新しいエスケープシーケンス
\e - メソッドグループの自然型の改善
- オブジェクト初期化子でのインデクサーへの暗黙的アクセス
- イテレーター/非同期処理での
refとunsafe - 部分プロパティ
C# 14 (net10.0)
- フィールドバッキングプロパティ(
fieldコンテキストキーワード) - 非構築ジェネリック型に対する
nameof - 拡張機能の改善(拡張ブロック)
- より多くのコンテキストでの
Span<T>のファーストクラス対応 - ジェネリック型向けの反制約
allows ref struct
C# 15 プレビュー (net11.0)
- コレクション式の引数(容量/比較子を指定する
with()構文):List<int> nums = [with(capacity: 32), 0, ..evens, ..odds]; HashSet<string> names = [with(comparer: StringComparer.OrdinalIgnoreCase), "Alice"]; - .NET 11 のプレビューが進むにつれて、追加機能が提供される予定です
.NET 11 Preview 1 の主な機能
これらの機能は、プレビュー機能を有効にした状態で net11.0 TFM が検出されると利用できます。
- ランタイム非同期処理:ランタイムレベルでの async/await(
<EnablePreviewFeatures>true</EnablePreviewFeatures>と<Features>$(Features);runtime-async=on</Features>が必要です) - Zstandard 圧縮:
System.IO.Compression.Zstandard(Brotli/Deflate より 2~7 倍高速) - BFloat16:AI/ML ワークロード向けの
System.Numerics.BFloat16 - Happy Eyeballs:デュアルスタックネットワーク向けの
ConnectAlgorithm.Parallel - Android 向け CoreCLR:MAUI Android Release ビルドの既定ランタイム
- XAML ソース生成:MAUI の既定機能(XAMLC を置き換えます)
- EF Core:TPT/TPC 継承を使用した複合型と JSON 列
- WASM 上の CoreCLR:Blazor WASM 向けの Mono に代わる試験的な選択肢
サポートライフサイクルに関する指針
バージョン情報を報告する際は、ライフサイクルの状況も含めてください。
- サポート終了が近づいている場合(6 か月以内):警告し、[skill:dotnet-version-upgrade] を提案してください
- プレビュー/RC の場合:ユーザーが明示的に利用を選択していない限り、「本番環境では使用しないでください」と警告してください
- STS がサポート終了を迎える場合:LTS と比べてサポート期間が短いことを伝えてください
- 現行の LTS の場合:新規プロジェクトで推奨されるターゲットであることを確認してください