SDK スタイルのプロジェクトでのターゲット フレームワーク
アプリまたはライブラリでフレームワークをターゲットに設定するときは、アプリまたはライブラリで使用できるようにする API のセットを指定します。 プロジェクト ファイルでターゲット フレームワークを指定するには、ターゲット フレームワーク モニカー (TFM) を使用します。
アプリまたはライブラリでは、.NET Standard のバージョンをターゲットにできます。 .NET Standard のバージョンは、.NET のすべての実装で標準化された API のセットを表します。 たとえば、ライブラリは、.NET Standard 1.6 をターゲットにして、.NET Core と .NET Framework で機能する API に同じコードベースを使ってアクセスできます。
また、アプリまたはライブラリは、.NET の特定の実装をターゲットにして、実装固有の API にアクセスすることもできます。 たとえば、Xamarin.iOS (Xamarin.iOS10
など) をターゲットにするアプリからは Xamarin が提供する iOS 10 用の iOS API ラッパーにアクセスでき、ユニバーサル Windows プラットフォーム (UWP、uap10.0
) をターゲットにするアプリからは Windows 10 を実行するデバイス用にコンパイルできる API にアクセスできます。
.NET Framework などの一部のターゲット フレームワークでは、API はフレームワークがシステムにインストールするアセンブリによって定義され、アプリケーション フレームワーク API (ASP.NET など) を含む場合があります。
パッケージベースのターゲット フレームワーク (.NET 5+、.NET Core、.NET Standard など) では、API はアプリまたはライブラリに含まれる NuGet パッケージによって定義されます。
次の表では、最も一般的なターゲット フレームワーク、それらの参照方法、およびそれらが実装する .NET Standard のバージョンを定義します。 これらのターゲット フレームワークのバージョンは、最新の安定したバージョンです。 プレリリース バージョンは記載されていません。 "ターゲット フレームワーク モニカー" (TFM) は、.NET アプリまたはライブラリのターゲット フレームワークを指定するための標準化されたトークン形式です。
ターゲット フレーム | 最新 安定バージョン |
ターゲット フレームワーク モニカー (TFM) | 実装済み .NET Standard バージョン |
---|---|---|---|
.NET 9 | 9 | net9.0 | 2.1 |
.NET 8 | 8 | net8.0 | 2.1 |
.NET Standard | 2.1 | netstandard2.1 | 該当なし |
.NET Core | 3.1 | netcoreapp3.1 | 2.1 |
.NET Framework | 4.8.1 | net481 | 2.0 |
ターゲット フレームワークは、通常、TFM によって参照されます。 次の表に、.NET SDK および NuGet クライアントによってサポートされるターゲット フレームワークを示します。 同等のものがかっこ内に示されています。 たとえば、win81
は netcore451
と同等の TFM です。
ターゲット フレームワーク | TFM |
---|---|
.NET 5+ (および .NET Core) | netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1 net5.0* net6.0* net7.0* net8.0* |
.NET Standard | netstandard1.0 netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1 |
.NET Framework | net11 net20 net35 net40 net403 net45 net451 net452 net46 net461 net462 net47 net471 net472 net48 net481 |
Windows ストア | netcore [netcore45] netcore45 [win] [win8] netcore451 [win81] |
.NET Micro Framework | netmf |
Silverlight | sl4 sl5 |
Windows Phone | wp [wp7] wp7 wp75 wp8 wp81 wpa81 |
ユニバーサル Windows プラットフォーム | uap [uap10.0] uap10.0 [win10] [netcore50] |
* .NET 5 以降の TFM には、オペレーティング システム固有のバリエーションがいくつか含まれています。 詳細については、次のセクション「.NET 5+ OS 固有の TFM」を参照してください。
net5.0
、net6.0
、net7.0
、net8.0
、net.0
の TFM には、さまざまなプラットフォームで動作するテクノロジが含まれています。 "OS 固有の TFM" を指定すると、オペレーティング システムに固有の API がアプリで使用できるようになります (Windows フォームや iOS バインディングなど)。 OS 固有の TFM は、ベース TFM で使用可能なすべての API (net9.0
TFM など) も継承します。
.NET 5 で、net5.0-windows
OS 固有の TFM が導入されました。これには、WinForms、WPF、UWP の各 API 用の Windows 固有のバインドが含まれています。 .NET 6 以降のバージョンには、OS 固有の TFM が追加されています (例: net6.0-ios
)。
次の表に、.NET 5+ TFM の互換性を示します。
TFM | 互換性あり |
---|---|
net5.0 |
net1..4 (NU1701 警告あり) netcoreapp1..3.1 (WinForms または WPF が参照されたときに警告) netstandard1..2.1 |
net5.0-windows |
netcoreapp1..3.1 (および net5.0 から継承された他のすべてのもの) |
net6.0 |
(net5.0 の後続バージョン) |
net6.0-android |
xamarin.android (および net6.0 から継承された他のすべてのもの) |
net6.0-ios |
net6.0 から継承されるすべてのもの |
net6.0-maccatalyst |
net6.0 から継承されるすべてのもの |
net6.0-macos |
net6.0 から継承されるすべてのもの |
net6.0-tvos |
net6.0 から継承されるすべてのもの |
net6.0-windows |
(net5.0-windows の後続バージョン) |
net7.0 |
(net6.0 の後続バージョン) |
net7.0-android |
(net6.0-android の後続バージョン) |
net7.0-ios |
(net6.0-ios の後続バージョン) |
net7.0-maccatalyst |
(net6.0-maccatalyst の後続バージョン) |
net7.0-macos |
(net6.0-macos の後続バージョン) |
net7.0-tizen |
tizen40 (および net7.0 から継承された他のすべてのもの) |
net7.0-tvos |
(net6.0-tvos の後続バージョン) |
net7.0-windows |
(net6.0-windows の後続バージョン) |
net8.0 |
(net7.0 の後続バージョン) |
net8.0-android |
(net7.0-android の後続バージョン) |
net8.0-browser |
net8.0 から継承されるすべてのもの |
net8.0-ios |
(net7.0-ios の後続バージョン) |
net8.0-maccatalyst |
(net7.0-maccatalyst の後続バージョン) |
net8.0-macos |
(net7.0-macos の後続バージョン) |
net8.0-tizen |
(net7.0-tizen の後続バージョン) |
net8.0-tvos |
(net7.0-tvos の後続バージョン) |
net8.0-windows |
(net7.0-windows の後続バージョン) |
net9.0 |
(net8.0 の後続バージョン) |
net9.0-android |
(net8.0-android の後続バージョン) |
net9.0-browser |
(net8.0-browser の後続バージョン) |
net9.0-ios |
(net8.0-ios の後続バージョン) |
net9.0-maccatalyst |
(net8.0-maccatalyst の後続バージョン) |
net9.0-macos |
(net8.0-macos の後続バージョン) |
net9.0-tizen |
(net8.0-tizen の後続バージョン) |
net9.0-tvos |
(net8.0-tvos の後続バージョン) |
net9.0-windows |
(net8.0-windows の後続バージョン) |
異なるプラットフォーム間でアプリを移植可能にしつつ、OS 固有の API に引き続きアクセスするために、OS 固有の複数の TFM をターゲットにして、#if
プリプロセッサ ディレクティブを使用して OS 固有の API 呼び出しに対してプラットフォーム ガードを追加することができます。 使用可能なシンボルの一覧については、「プリプロセッサ シンボル」 を参照してください。
次のガイドラインを使用して、アプリで使用する TFM を決定します。
- 複数のプラットフォームに移植可能なアプリの場合、ベース TFM (
net9.0
など) をターゲットにする必要があります。 これにはほとんどのライブラリと、ASP.NET Core と Entity Framework も含まれます。 - プラットフォーム固有のライブラリの場合、プラットフォーム固有のフレーバーをターゲットにする必要があります。 たとえば、WinForms プロジェクトと WPF プロジェクトは
net9.0-windows
をターゲットにする必要があります。 - クロスプラットフォーム アプリケーション モデル (Xamarin Forms、ASP.NET Core) とブリッジ パック (Xamarin Essentials) の場合、少なくともベース TFM (
net9.0
など) をターゲットにする必要がありますが、さらに多くの API または機能を利用するために、プラットフォーム固有の追加のフレーバーをターゲットとすることもできます。
OS 固有の TFM の末尾でオプションの OS バージョンを指定することもできます (例: net6.0-ios15.0
)。 バージョンによって、アプリまたはライブラリで使用できる API を指定します。 これは、アプリまたはライブラリで実行時にサポートされる OS バージョンの制御は行いません。 これは、プロジェクトのコンパイルに使用する参照アセンブリを選択し、NuGet パッケージからアセットを選択するために使用されます。 このバージョンは、実行時の OS バージョンと区別するために、"プラットフォーム バージョン" または "OS API バージョン" と考えてください。
OS 固有の TFM でプラットフォーム バージョンが明示的に指定されていない場合は、ベース TFM とプラットフォーム名から推論できる暗黙の値を持ちます。 たとえば、.NET 6 での Android の既定のプラットフォーム値は 31.0
です。これは、net6.0-android
が正規の net6.0-android31.0
TFM の短縮形であることを意味しています。 新しいベース TFM の暗黙のプラットフォーム バージョンはより新しくなる可能性があります。たとえば、将来の net8.0-android
TFM は net8.0-android34.0
にマップされる可能性があります。 この短縮形はプロジェクト ファイル内での使用のみを目的としており、NuGet などの他のツールに渡される前に、.NET SDK の MSBuild ターゲットによって正規の形式に拡張されます。
次の表に、各 .NET リリースの既定のターゲット プラットフォーム値 (TPV) を示します。
.NET バージョン | Android | iOS | Mac Catalyst | macOS | tvOS | Tizen | Windows |
---|---|---|---|---|---|---|---|
.NET 8 | 34.0 | 17.2 | 17.2 | 14.2 | 17.1 | 7.0 | 10.0 |
.NET 9 | 35.0 | 18.0 | 18.0 | 15.0 | 7.0 | 10.0 |
注意
.NET 8 以前の Apple プラットフォーム (iOS、macOS、tvOS、Mac Catalyst) では、既定の TPV は現在インストールされているワークロードでサポートされている最新バージョンです。 つまり、たとえば .NET 8 で iOS ワークロードを更新すると、そのワークロードに新しいバージョンの iOS のサポートが追加されている場合は、既定の TPV が高くなる可能性があります。 上の表に記載されている既定の TPV は、指定された .NET バージョンの初期リリースの TPV です。
.NET 9 以降では、この特別な動作は実行可能プロジェクトにのみ適用されます。 ライブラリ プロジェクトの既定の TPV は、他のすべてのプラットフォームと同様に、メジャー .NET リリース全体で同じままになります。
.NET SDK は、新しいバージョンのベース TFM を使用せずに、個別のプラットフォーム用に新しくリリースされた API をサポートできるように設計されています。 これにより、.NET のメジャー リリースを待つことなく、プラットフォーム固有の機能にアクセスできます。 TFM のプラットフォーム バージョンをインクリメントすることで、これらの新しくリリースされた API にアクセスできます。 たとえば、Android プラットフォームで .NET 6.0.x SDK の更新プログラムに API level 32 API が追加された場合は、TFM net6.0-android32.0
を使用してアクセスできます。
アプリが、異なる TFM の複数のアセットを含むパッケージを参照する場合、バージョン番号が近いアセットが優先されます。 たとえば、アプリが net6.0-ios
をターゲットとし、パッケージが net6.0
と net5.0-ios
のアセットを提供する場合、net6.0
のアセットが使用されます。 詳細については、「優先順位」を参照してください。
プラットフォーム固有のアプリまたはライブラリはその OS の特定のバージョンの API に対してコンパイルされますが、プロジェクト ファイルに SupportedOSPlatformVersion
プロパティを追加することで、以前のバージョンの OS と互換性を持たせることができます。 SupportedOSPlatformVersion
プロパティにより、アプリまたはライブラリを実行するために必要な最小 OS バージョンを指定できます。 この最小のランタイム OS バージョンをプロジェクトで明示的に指定しない場合は、既定で TFM のプラットフォーム バージョンが使用されます。
以前のバージョンの OS でアプリを正常に実行するために、そのバージョンの OS には存在しない API を呼び出すことはできません。 ただし、新しい API の呼び出しにガードを追加して、その API がサポートされているバージョンの OS で実行する場合にのみ呼び出されるようにすることができます。 このパターンを使用すると、新しいバージョンの OS での実行時には新しい OS 機能を利用しながら、以前のバージョンの OS での実行もサポートされるようにアプリまたはライブラリを設計することができます。
SupportedOSPlatformVersion
の値 (明示的でも既定値でも) はプラットフォーム互換性アナライザーによって使用され、新しい API へのガードなしの呼び出しが検出されて警告されます。 これは、プロジェクトのコンパイル済みアセンブリに UnsupportedOSPlatformAttribute アセンブリ属性として書き込まれます。これにより、プラットフォーム互換性アナライザーで、より小さい SupportedOSPlatformVersion
値でのプロジェクトからそのアセンブリの API へのガードなしの呼び出しを検出できるようになります。 プラットフォームによっては、SupportedOSPlatformVersion
値がプラットフォーム固有のアプリのパッケージ化とビルド プロセスに影響します。これはそれらのプラットフォームに関するドキュメントで説明されています。
TargetFramework
および SupportedOSPlatformVersion
MSBuild プロパティを使用して、アプリまたはライブラリが iOS 15.0 API にアクセスできるが、iOS 13.0 以降での実行がサポートされていることを指定するプロジェクト ファイル例の抜粋を次に示します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-ios15.0</TargetFramework>
<SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
</PropertyGroup>
...
</Project>
ターゲット フレームワークはプロジェクト ファイルで指定します。 単一のターゲット フレームワークを指定するときは、TargetFramework 要素を使用します。 次のコンソール アプリ プロジェクト ファイルは、.NET 9 をターゲットにする方法を示しています。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
</Project>
複数のターゲット フレームワークを指定するときは、各ターゲット フレームワークに対するアセンブリを条件付きで参照できます。 コードでは、プリプロセッサ シンボル と if-then-else ロジックを使うことで、これらのアセンブリに対して条件付きでコンパイルできます。
次のライブラリ プロジェクトでは、.NET Standard (netstandard1.4
) と .NET Framework (net40
および net45
) の API がターゲットにされています。 ターゲット フレームワークが複数あるときは、複数形の TargetFrameworks 要素を使用します。 ライブラリが 2 つの .NET Framework TFM に対してコンパイルされる場合、Condition
属性には実装固有のパッケージが含まれます。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
</PropertyGroup>
<!-- Conditionally obtain references for the .NET Framework 4.0 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
<Reference Include="System.Net" />
</ItemGroup>
<!-- Conditionally obtain references for the .NET Framework 4.5 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
<Reference Include="System.Net.Http" />
<Reference Include="System.Threading.Tasks" />
</ItemGroup>
</Project>
ライブラリまたはアプリ内で、プリプロセッサ ディレクティブを使用して各ターゲット フレームワーク用にコンパイルするための条件付きコードを記述します。
public class MyClass
{
static void Main()
{
#if NET40
Console.WriteLine("Target framework: .NET Framework 4.0");
#elif NET45
Console.WriteLine("Target framework: .NET Framework 4.5");
#else
Console.WriteLine("Target framework: .NET Standard 1.4");
#endif
}
}
SDK スタイル プロジェクトを使用する場合、ビルド システムは、「サポートされるターゲット フレームワークのバージョン」の表で示されているターゲット フレームワークを表すプリプロセッサ シンボルを認識します。 .NET Standard、.NET Core、または NET 5+ TFM を表すシンボルを使うときは、ドットとハイフンをアンダースコアに置き換え、小文字を大文字に変更します (たとえば、netstandard1.4
のシンボルは NETSTANDARD1_4
です)。
DisableImplicitFrameworkDefines
プロパティを使用して、これらのシンボルの生成を無効にすることができます。 このプロパティの詳細については、「DisableImplicitFrameworkDefines」を参照してください。
.NET ターゲット フレームワークのプリプロセッサ シンボルの完全な一覧を次に示します。
ターゲット フレームワーク | Symbols | 追加のシンボル (.NET 5 以降の SDK で使用可能) |
プラットフォーム シンボル (OS 固有の TFM を指定する場合のみ使用可能) |
---|---|---|---|
.NET Framework | NETFRAMEWORK 、 NET481 、 NET48 、 NET472 、 NET471 、 NET47 、 NET462 、 NET461 、 NET46 、 NET452 、 NET451 、 NET45 、 NET40 、 NET35 、 NET20 |
NET48_OR_GREATER 、 NET472_OR_GREATER 、 NET471_OR_GREATER 、 NET47_OR_GREATER 、 NET462_OR_GREATER 、 NET461_OR_GREATER 、 NET46_OR_GREATER 、 NET452_OR_GREATER 、 NET451_OR_GREATER 、 NET45_OR_GREATER 、 NET40_OR_GREATER 、 NET35_OR_GREATER 、 NET20_OR_GREATER |
|
.NET Standard | NETSTANDARD 、 NETSTANDARD2_1 、 NETSTANDARD2_0 、 NETSTANDARD1_6 、 NETSTANDARD1_5 、 NETSTANDARD1_4 、 NETSTANDARD1_3 、 NETSTANDARD1_2 、 NETSTANDARD1_1 、 NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER 、 NETSTANDARD2_0_OR_GREATER 、 NETSTANDARD1_6_OR_GREATER 、 NETSTANDARD1_5_OR_GREATER 、 NETSTANDARD1_4_OR_GREATER 、 NETSTANDARD1_3_OR_GREATER 、 NETSTANDARD1_2_OR_GREATER 、 NETSTANDARD1_1_OR_GREATER 、 NETSTANDARD1_0_OR_GREATER |
|
.NET 5+ (および .NET Core) | NET 、 NET9_0 、 NET8_0 、 NET7_0 、 NET6_0 、 NET5_0 、 NETCOREAPP 、 NETCOREAPP3_1 、 NETCOREAPP3_0 、 NETCOREAPP2_2 、 NETCOREAPP2_1 、 NETCOREAPP2_0 、 NETCOREAPP1_1 、 NETCOREAPP1_0 |
NET8_0_OR_GREATER 、 NET7_0_OR_GREATER 、 NET6_0_OR_GREATER 、 NET5_0_OR_GREATER 、 NETCOREAPP3_1_OR_GREATER 、 NETCOREAPP3_0_OR_GREATER 、 NETCOREAPP2_2_OR_GREATER 、 NETCOREAPP2_1_OR_GREATER 、 NETCOREAPP2_0_OR_GREATER 、 NETCOREAPP1_1_OR_GREATER 、 NETCOREAPP1_0_OR_GREATER |
ANDROID 、 BROWSER 、 IOS 、 MACCATALYST 、 MACOS 、 TVOS 、 WINDOWS 、[OS][version] (例: IOS15_1 )、[OS][version]_OR_GREATER (例: IOS15_1_OR_GREATER ) |
注意
- バージョンレスのシンボルは、ターゲットとするバージョンに関係なく定義されます。
- バージョン固有のシンボルは、対象とするバージョンに対してのみ定義されます。
<framework>_OR_GREATER
シンボルは、ターゲットとするバージョンとそれ以前のすべてのバージョンに対して定義されます。 たとえば、.NET Framework 2.0 をターゲットとする場合、NET20
、NET20_OR_GREATER
、NET11_OR_GREATER
、NET10_OR_GREATER
のシンボルが定義されます。NETSTANDARD<x>_<y>_OR_GREATER
シンボルは.NET Standard ターゲットにのみ定義され、.NET Core や .NET Framework などの .NET Standard を実装するターゲットには定義されません。- これらは、MSBuild
TargetFramework
プロパティと NuGet で使用されるターゲット フレームワーク モニカー (TFM) とは異なります。
次のターゲット フレームワークは非推奨とされます。 これらのターゲット フレームワークをターゲットにするパッケージは、指定されている代替のものに移行する必要があります。
非推奨の TFM | 代替 |
---|---|
aspnet50 aspnetcore50 dnxcore50 dnx dnx45 dnx451 dnx452 |
netcoreapp |
dotnet dotnet50 dotnet51 dotnet52 dotnet53 dotnet54 dotnet55 dotnet56 |
netstandard |
netcore50 | uap10.0 |
勝利 | netcore45 |
win8 | netcore45 |
win81 | netcore451 |
win10 | uap10.0 |
winrt | netcore45 |
.NET に関するフィードバック
.NET はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。