mcpField
D
dotnet-version-detection

dotnet-version-detection

github.com/wshaddix開発8672 回インストール35 週間前に更新
リポジトリ

dotnet-version-detection について

.NET のバージョン情報をプロジェクトファイルから検出し、解決したターゲットフレームワークと SDK に応じたガイダンスを示すスキルです。他の .NET 開発スキルより先に実行し、優先順位に沿って設定を調べ、言語バージョンやプレビュー設定も確認します。

主な機能

  1. 01プロジェクトファイルからターゲットフレームワークを解決
  2. 02global.json と SDK をフォールバックに使用
  3. 03C# 言語設定とプレビュー設定の確認
  4. 04ターゲットフレームワークと SDK の不一致を通知
  5. 05プロジェクトごとの検出結果のキャッシュ

活用シーン

  1. 01既存の .NET プロジェクトに適したガイダンスの選択
  2. 02SDK とターゲットフレームワークの整合性確認
  3. 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.0
  • 9.0.xxx → net9.0
  • 10.0.xxx → net10.0
  • 11.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 では SDK 9.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 ファイルを確認し、参照されているプロジェクトを調べます
  • プロジェクトファイルが見つからない場合は、次のフォールバック手順に進みます。
    1. global.json から SDK バージョンを読み取り(ステップ 4a)、TFM を推定します
    2. global.json がない場合は、dotnet --version(ステップ 4b)を使用して TFM を推定します
    3. どちらの推定方法も失敗した場合に限り:「.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 VersionStatusC# VersionTFMSupport EndNotes
.NET 8LTS (アクティブ)C# 12net8.02026年11月サポート終了が近づいています
.NET 9STSC# 13net9.02026年5月サポート終了が近づいています
.NET 10LTS (現行)C# 14net10.02028年11月新しいプロジェクトに推奨
.NET 11Preview 1C# 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 の場合:新規プロジェクトで推奨されるターゲットであることを確認してください

コメント