目标框架Target frameworks

本文内容

以应用或库中的框架为目标时,需要指定想要向应用或库提供的 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 Standard 和 .NET Core),API 由包含在应用或库中的包定义。元包是一个 NuGet 包,NuGet 包本身不包含任何内容,只是一个依赖项列表(其他包)。基于 NuGet 包的目标框架隐式指定一个元包,该元包引用一起构成框架的所有包。

最新目标框架版本Latest target framework versions

下表定义了最常见的目标框架、如何引用这些框架,以及它们实现的 .NET Standard 版本。这些目标框架版本是最新的稳定版本。预览版不会显示。目标框架名字对象 (TFM) 是一个标准化令牌格式,用于指定 .NET 应用或库的目标框架。

目标 Framework最新稳定版本目标框架名字对象 (TFM)已实现.NET Standard 版本
.NET Standard2.0netstandard2.0不可用
.NET Core2.2netcoreapp2.22.0
.NET Framework4.7.2net4722.0

支持的目标框架版本Supported target framework versions

目标框架通常由 TFM 引用。下表显示 .NET Core SDK 和 NuGet 客户端支持的目标框架。等效项显示在括号内。例如,win81 对于 netcore451 来说等效于 TFM。

目标 FrameworkTFM
.NET Standardnetstandard1.0netstandard1.1netstandard1.2netstandard1.3netstandard1.4netstandard1.5netstandard1.6netstandard2.0
.NET Corenetcoreapp1.0netcoreapp1.1netcoreapp2.0netcoreapp2.1netcoreapp2.2
.NET Frameworknet11net20net35net40net403net45net451net452net46net461net462net47net471net472
Windows 应用商店netcore [netcore45]netcore45 [win] [win8]netcore451 [win81]
.NET Micro Frameworknetmf
Silverlightsl4sl5
Windows Phonewp [wp7]wp7wp75wp8wp81wpa81
通用 Windows 平台uap [uap10.0]uap10.0 [win10] [netcore50]

如何指定目标框架How to specify target frameworks

在项目文件中指定目标框架。指定单个目标框架时,使用 TargetFramework 元素。以下控制台应用项目文件演示了如何以 .NET Core 2.2 为目标:

  1. <Project Sdk="Microsoft.NET.Sdk">
  2. <PropertyGroup>
  3. <OutputType>Exe</OutputType>
  4. <TargetFramework>netcoreapp2.2</TargetFramework>
  5. </PropertyGroup>
  6. </Project>

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

以下库项目文件以 .NET Standard (netstandard1.4) 的 API 和 .NET Framework(net40net45)的 API 作为目标。将复数形式的 TargetFrameworks 元素与多个目标框架一起使用。请注意为两个 .NET Framework TFM 编译库时,Condition 属性包括特定于实现的包的方法:

  1. <Project Sdk="Microsoft.NET.Sdk">
  2. <PropertyGroup>
  3. <TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
  4. </PropertyGroup>
  5. <!-- Conditionally obtain references for the .NET Framework 4.0 target -->
  6. <ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
  7. <Reference Include="System.Net" />
  8. </ItemGroup>
  9. <!-- Conditionally obtain references for the .NET Framework 4.5 target -->
  10. <ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
  11. <Reference Include="System.Net.Http" />
  12. <Reference Include="System.Threading.Tasks" />
  13. </ItemGroup>
  14. </Project>

在库或应用中,编写条件代码以为每个目标框架编译:

  1. public class MyClass
  2. {
  3. static void Main()
  4. {
  5. #if NET40
  6. Console.WriteLine("Target framework: .NET Framework 4.0");
  7. #elif NET45
  8. Console.WriteLine("Target framework: .NET Framework 4.5");
  9. #else
  10. Console.WriteLine("Target framework: .NET Standard 1.4");
  11. #endif
  12. }
  13. }

生成系统可识别预处理器符号,这些符号表示支持的目标框架版本表中所示的目标框架。使用表示 .NET Standard 或 .NET Core TFM 的符号时,用下划线替代句点,并将小写字母转换为大写字母(例如,netstandard1.4 的符号是 NETSTANDARD1_4)。

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

目标框架符号
.NET FrameworkNET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472
.NET StandardNETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0
.NET CoreNETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1, NETCOREAPP2_2

已弃用的目标框架Deprecated target frameworks

以下目标框架已弃用。以这些目标框架为目标的包应迁移到指明的替代框架。

已弃用的 TFMReplacement
aspnet50aspnetcore50dnxcore50dnxdnx45dnx451dnx452netcoreapp
dotnetdotnet50dotnet51dotnet52dotnet53dotnet54dotnet55dotnet56netstandard
netcore50uap10.0
winnetcore45
win8netcore45
win81netcore451
win10uap10.0
winrtnetcore45

请参阅See also