如今 dotnet 的 TargetFramework
愈来愈多,抛开 .NET Framework 不谈,若是一个类库支持多个 TargetFramework
应用实际运行的时候会使用哪一个版本的 API 呢,以前一直都是想固然的自觉得是了,因而想测试一下实际解析是怎么样的,来看下面的示例吧git
首先来看类库示例项目:github
项目文件以下:c#
类库提供了多个 TargetFramework
的支持:app
netstandard2.0
netcoreapp2.1
netstandard2.1
netcoreapp3.1
net5.0
net6.0
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;netcoreapp2.1;netstandard2.1;netcoreapp3.1;net5.0;net6.0</TargetFrameworks> </PropertyGroup> </Project>
类库里只提供了一个类,只有一个用于测试的方法,方法实现以下:框架
public class Test { public static string GetResult() { var result = string.Empty; #if NET6_0 result = "NET6.0"; #elif NET5_0 result = "NET5.0"; #elif NETCOREAPP3_1 result = "NETCOREAPP3_1"; #elif NETCOREAPP3_0 result = "NETCOREAPP3_0"; #elif NETCOREAPP2_1 result = "NETCOREAPP2_1"; #elif NETSTANDARD2_1 result = "NETSTANDARD2_1"; #elif NETSTANDARD2_0 result = "NETSTANDARD2_0"; #endif return result; } }
经过条件编译在不一样的 TargetFramework
下返回不一样的值以测试实际执行的代码测试
接着看一个可执行的 Console 应用,项目文件示例以下:.net
Console
应用支持的 TargetFramework
以下:code
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFrameworks>netcoreapp2.0;netcoreapp2.1;netcoreapp3.0;netcoreapp3.1;net5.0;net6.0</TargetFrameworks> <NoWarn>;NETSDK1138</NoWarn> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\TestClassLibrary\TestClassLibrary.csproj" /> </ItemGroup> </Project>
由于 netcoreapp2.0
和 .netcoreapp3.0
已经再也不支持,若是直接使用会获得一个 Warning:xml
因此在项目文件中配置了 <NoWarn>;NETSDK1138</NoWarn>
来忽略这个警告blog
测试代码很简单,直接调用类库示例中的测试方法:
Console.WriteLine(Test.GetResult()); Console.WriteLine("Hello World!"); Console.ReadLine();
接着咱们就来测试吧,先思考一下吧,不一样的 TargetFramework
输出的结果分别是什么呢?
从上面的测试结果其实就可以大概看出来,多个 TargetFramework
的解析顺序,可执行应用程序首先会匹配与当前运行的 TargetFramework
相符的框架,若是没有与当前运行的 TargetFramework
相符的框架,则会fallback 到低版本的 .NET 框架上,优先选择高版本的框架,若是当前运行的框架版本是 net6.0
,可是类库不支持 net6.0
,则会使用 net5.0
,若是类库不支持 net5.0
则会使用 netcoreapp3.1
以此类推。
若是既有 .NET Core 的框架支持又有 .NET Standard 的支持,则会优先使用 .NET Core 框架,没有可用的 .NET Core 框架的话再开始看类库支持的 .NET Standard 的支持,优先选择当前框架支持的高版本的 .NET Standard 框架
最后扩展一下,引用单个类库是上面这样的,若是类库引用了类库,那又会如何呢
测试项目结构以下,测试项目基于 .NET6.0
,引用了一个基于 netstandard2.0
/netstandard2.1
的类库项目 ClassLibrary1
,而 ClassLibrary1
引用了另一个基于netstandard2.0
/netstandard2.1
/netcoreapp2.1
的类库项目,测试方法和上面的差很少,测试项目调用 ClassLibrary1
中的测试方法(实际调用了 ClassLibrary2
中的测试方法)
ConsoleApp(NET6.0
)
netstandard2.0
/netstandard2.1
)
netstandard2.0/netstandard2.1/netcoreapp2.1
)输出结果以下:
从上面的结果来看,实际的解析结果运行结果都是根据最终执行到的类库结合应用当前运行框架来决定使用哪一个版本的代码的