通过


SDK 样式项目中的目标框架

以应用或库中的框架为目标时,需要指定想要向应用或库提供的 API 集。 使用目标框架标识符 (TFM) 在项目文件中指定目标框架。

应用或库可以面向 .NET Standard 版本。 .NET标准版本表示所有.NET实现中的标准化 API 集。 例如,库可以面向 .NET Standard 1.6,并使用相同的代码库来访问提供跨 .NET Core 和 .NET Framework 功能的 API。

应用或库还可以以特定的.NET实现为目标,以获取对特定于实现的 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 标准版本
.NET 10 10 net10.0 2.1
.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 核心) netcoreapp1.0
netcoreapp1.1
netcoreapp2.0
netcoreapp2.1
netcoreapp2.2
netcoreapp3.0
netcoreapp3.1
net5.0*
net6.0*
net7.0*
net8.0*
net9.0*
net10.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 [Windows] [Windows8]
netcore451 [win81]
.NET nanoFramework netnano1.0
.NET Micro Framework netmf
Silverlight sl4
sl5
Windows电话 wp [wp7]
wp7
wp75
wp8
wp81
wpa81
通用 Windows 平台 uap [uap10.0]
uap10.0 [win10] [netcore50]

* .NET 5 和更高版本的 TPM 包括一些特定于操作系统的变体。 有关详细信息,请参阅以下部分,特定于操作系统的 TFM

操作系统特定的目标框架 (TFMs)

net8.0net9.0net10.0 TFM 包含可在不同平台上运行的技术。 指定与操作系统相关的 TFM,可以使特定于操作系统的 API 可供您的应用使用,例如 Windows 窗体 或 iOS 绑定。 特定于操作系统的 TFM 会继承其基础 TFM中的所有可用 API,例如 net10.0 TFM。

下表显示了 .NET 8 个以上的TFM 的兼容性。

TFM 可兼容对象
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
net10.0 (后续版本的 net9.0
net10.0-android (后续版本的 net9.0-android
net10.0-browser (后续版本的 net9.0-browser
net10.0-ios (后续版本的 net9.0-ios
net10.0-maccatalyst (后续版本的 net9.0-maccatalyst
net10.0-macos (后续版本的 net9.0-macos
net10.0-tizen (后续版本的 net9.0-tizen
net10.0-tvos (后续版本的 net9.0-tvos
net10.0-windows (后续版本的 net9.0-windows

若要使应用可跨不同平台移植,但仍有权访问特定于 OS 的 API,你可以定位多个特定于 OS 的 TFM,并使用 #if 预处理器指令围绕特定于 OS 的 API 调用增加平台防护。 有关可用符号的列表,请参阅预处理器符号

建议的目标

使用以下准则确定在应用中使用哪种 TFM:

  • 可移植到多个平台的应用应面向基础 TFM,例如 net10.0。 这包括大多数库,但也包括ASP.NET Core和Entity Framework。
  • 特定于平台的库应面向特定于平台的风格。 例如,WinForms 和 WPF 项目应面向 net10.0-windows
  • 跨平台应用程序模型(例如,ASP.NET Core)至少应面向基本 TFM,例如,net10.0,但也可能针对其他特定于平台的风格来点亮更多 API 或功能。

TFM 中的 OS 版本

你还可以在 OS 特定的 TFM 的末尾指定可选的 OS 版本,例如,net8.0-ios17.2。 版本说明哪些 API 对您的应用或库可用。 它不会控制应用或库在运行时支持的 OS 版本。 它用于选择您的项目编译时所依赖的参考程序集,以及从 NuGet 包中选择资产。 将此版本视为“平台版本”或“OS API 版本”,以将其与运行时 OS 版本区分开来。

.NET SDK 旨在支持单个平台的新发布的 API,而无需新版本的基本 TFM。 这样,便可以访问特定于平台的功能,而无需等待.NET的主要版本。 可以通过在 TFM 中增加平台版本来访问这些新发布的 API。 例如,如果 Android 平台在 .NET 8.0.x SDK 更新中添加了 API 级别 34 API,则可以使用 TFM net8.0-android34.0访问它们。

当特定于 OS 的 TFM 不显式指定平台版本时,它具有可从基础 TFM 和平台名称推断的隐含值。 例如,.NET 9 中 Android 的默认平台版本为 35.0,这意味着 net9.0-android是规范net9.0-android35.0 TFM 的简写。 简写形式仅用于项目文件,在传递给其他工具(如 NuGet)之前,.NET SDK 的 MSBuild 目标文件将其扩展为规范形式。

下表显示了适用于 Android 和 iOS 的每个.NET版本的 default 目标平台版本 (TPV)。 如果要使用最新的绑定,请使用默认值(即,不指定 OS 版本)。

.NET版本 Android iOS
.NET 8 34.0 17.2
.NET 9 35.0 18.0
.NET 10 36.0 18.7

从 .NET 9 开始,当服务版本引入对更高版本的 TPV 的支持时(它始终具有相同的 major 版本号(与最初发布.NET版本时一样),该.NET版本的最早支持的 TPV 将仍然受支持。 例如,对于 .NET 9,最早支持的 iOS 版本 18.0 仍受支持,即使服务版本添加了对最新 iOS 18.x 版本的支持。 如果需要为某个 .NET 版本使用最早的绑定,请在 TFM 中使用特定的操作系统版本号。

备注

在 .NET 8 及更早版本中的 Apple 平台(iOS、macOS、tvOS 和 Mac Catalyst),默认 TPV 是当前安装的工作负载中支持的最新版本。 这意味着,如果在 .NET 8 中更新 iOS 工作负荷,则可能会导致默认 TPV 更高(如果对 iOS 的新版本的支持已添加到该工作负荷中)。 在上表中,默认 TPV 是所声明.NET版本的初始版本中的版本。

从 .NET 9 开始,此特殊行为仅适用于 executable 项目。 库项目的默认 TPV 现在与所有其他平台一样,在主要.NET版本中保持不变。

优先顺序

如果应用引用了一个包,该包具有不同 TFM 的多个资产,则首选版本号更接近的资产。 例如,如果应用面向 net9.0-ios,且包提供 net9.0net8.0-ios 资产,那么将使用 net9.0 资产。 有关详细信息,请参阅优先顺序

支持旧版 OS

虽然特定于平台的应用或库是针对特定版本的 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 10 为目标:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
  </PropertyGroup>

</Project>

指定多个目标框架时,可以为每个目标框架有条件地引用程序集。 在代码中,可使用具有 if-then-else 逻辑的预处理器符号,有条件地针对这些程序集进行编译。

以下库项目面向.NET标准版(netstandard1.4)和.NET框架(net40net45)的 API。 将复数形式的 TargetFrameworks 元素与多个目标框架一起使用。 Condition 属性在为两个 .NET Framework TFM 编译库时包括特定于实现的包:

<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
    }
}

TargetFramework 值是别名

TargetFramework 属性值(例如,net10.0)是一个友好名称(别名),.NET SDK 会将其转换为规范名称属性。 具体而言,SDK 从 TargetFramework 值设置以下属性:

  • TargetFrameworkMoniker(例如,.NETCoreApp,Version=v10.0
  • TargetFrameworkIdentifier(例如,.NETCoreApp
  • TargetFrameworkVersion(例如,v10.0
  • TargetPlatformMonikerTargetPlatformIdentifierTargetPlatformVersion (面向特定平台时)

NuGet 和 .NET SDK 使用这些名字对象属性(而不是 TargetFramework 字符串)进行包兼容性检查和生成逻辑。 对于特定于 OS 的 TFM,此转换已发生。 例如,net10.0-windows转换为 TargetFrameworkMoniker = .NETCoreApp,Version=v10.0TargetPlatformMoniker = Windows,Version=7.0

由于别名只是一个名称,TargetFramework 的值可以是任意字母数字字符串,只要正确设置相应的别名属性。 以下项目文件使用名为 banana 的自定义别名,并显式设置标识名称属性,以便项目在 .NET 10.0 环境下构建和恢复。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>banana</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(TargetFramework)' == 'banana' ">
    <TargetFrameworkIdentifier>.NETCoreApp</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
    <TargetFrameworkMoniker>.NETCoreApp,Version=v10.0</TargetFrameworkMoniker>
  </PropertyGroup>
</Project>

有关这些属性的详细信息,请参阅 TargetFramework MSBuild 属性参考。

预处理器符号

使用 SDK 样式项目时,生成系统可识别预处理器符号,这些符号表示支持的目标框架版本表中所示的目标框架。 若要将 .NET Standard、.NET Core 或 .NET 5+ TFM 转换为预处理器符号,请将点和连字符替换为下划线,并将小写字母更改为大写(例如,netstandard2.0的符号为 NETSTANDARD2_0)。

可以通过 DisableImplicitFrameworkDefines 属性禁止生成这些符号。 有关此属性的详细信息,请参阅 DisableImplicitFrameworkDefines

.NET目标框架的预处理器符号的完整列表为:

目标框架 符号 其他符号
(适用于 .NET 5 及以上版本的 SDK)
平台符号(仅
在指定特定于 OS 的 TFM 时可用)
.NET Framework NETFRAMEWORKNET481NET48NET472NET471NET47NET462NET461NET46NET452NET451NET45NET40NET35NET20 NET48_OR_GREATERNET472_OR_GREATERNET471_OR_GREATERNET47_OR_GREATERNET462_OR_GREATERNET461_OR_GREATERNET46_OR_GREATERNET452_OR_GREATERNET451_OR_GREATERNET45_OR_GREATERNET40_OR_GREATERNET35_OR_GREATERNET20_OR_GREATER
.NET Standard NETSTANDARD、、NETSTANDARD2_1NETSTANDARD2_0NETSTANDARD1_6NETSTANDARD1_5NETSTANDARD1_4NETSTANDARD1_3NETSTANDARD1_2、、 NETSTANDARD1_1NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER、、NETSTANDARD2_0_OR_GREATERNETSTANDARD1_6_OR_GREATERNETSTANDARD1_5_OR_GREATERNETSTANDARD1_4_OR_GREATERNETSTANDARD1_3_OR_GREATERNETSTANDARD1_2_OR_GREATER、、 NETSTANDARD1_1_OR_GREATERNETSTANDARD1_0_OR_GREATER
.NET 5+ (和 .NET 核心) NETNET10_0NET9_0NET8_0NET7_0NET6_0NET5_0NETCOREAPPNETCOREAPP3_1NETCOREAPP3_0NETCOREAPP2_2NETCOREAPP2_1NETCOREAPP2_0NETCOREAPP1_1NETCOREAPP1_0 NET10_0_OR_GREATERNET9_0_OR_GREATERNET8_0_OR_GREATERNET7_0_OR_GREATERNET6_0_OR_GREATERNET5_0_OR_GREATERNETCOREAPP3_1_OR_GREATERNETCOREAPP3_0_OR_GREATERNETCOREAPP2_2_OR_GREATERNETCOREAPP2_1_OR_GREATERNETCOREAPP2_0_OR_GREATERNETCOREAPP1_1_OR_GREATERNETCOREAPP1_0_OR_GREATER ANDROID、、BROWSERIOSMACCATALYSTMACOSTVOS、、 WINDOWS
[OS][version](例如,IOS15_1),
[OS][version]_OR_GREATER(例如,IOS15_1_OR_GREATER

备注

  • 无论目标版本是什么,都将定义无版本符号。
  • 仅针对目标版本定义特定于版本的符号。
  • 为目标版本和所有早期版本定义 <framework>_OR_GREATER 符号。 例如,如果要面向 .NET Framework 2.0,则定义了以下符号:NET20NET20_OR_GREATERNET11_OR_GREATERNET10_OR_GREATER
  • NETSTANDARD<x>_<y>_OR_GREATER符号仅用于.NET标准目标,而不适用于实现.NET标准的目标,例如.NET Core 和 .NET Framework。
  • 它们与 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
Windows 8 netcore45
Windows 8.1 netcore451
Windows 10 uap10.0
winrt netcore45

另请参阅