dotnet core TargetFramework 解析顺序测试
dotnet core TargetFramework 解析顺序测试
Intro
现在 dotnet 的 TargetFramework
越来越多,抛开 .NET Framework 不谈,如果一个类库支持多个 TargetFramework
应用实际运行的时候会使用哪个版本的 API 呢,之前一直都是想当然的自以为是了,于是想测试一下实际解析是怎么样的,来看下面的示例吧
Sample
Library Sample
首先来看类库示例项目:
项目文件如下:
类库提供了多个 TargetFramework
的支持:
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
下返回不同的值以测试实际执行的代码
Executable Sample
接着看一个可执行的 Console 应用,项目文件示例如下:
Console
应用支持的 TargetFramework
如下:
- netcoreapp2.0
- netcoreapp2.1
- netcoreapp3.0
- netcoreapp3.1
- net5.0
- net6.0
<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:
所以在项目文件中配置了 <NoWarn>;NETSDK1138</NoWarn>
来忽略这个警告
测试代码很简单,直接调用类库示例中的测试方法:
Console.WriteLine(Test.GetResult());
Console.WriteLine("Hello World!");
Console.ReadLine();
Test Output
接着我们就来测试吧,先思考一下吧,不同的 TargetFramework
输出的结果分别是什么呢?
net6.0
net5.0
netcoreapp3.1
netcoreapp3.0
netcoreapp2.1
netcoreapp2.0
More
从上面的测试结果其实就能够大概看出来,多个 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
)
- ClassLibrary1(
netstandard2.0
/netstandard2.1
)- ClassLibrary2(
netstandard2.0/netstandard2.1/netcoreapp2.1
)
- ClassLibrary2(
输出结果如下:
从上面的结果来看,实际的解析结果运行结果都是根据最终执行到的类库结合应用当前运行框架来决定使用哪个版本的代码的
References
- https://github.com/WeihanLi/SamplesInPractice/tree/master/UnexpectedSamples
- https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-target-the-net-framework
dotnet core TargetFramework 解析顺序测试的更多相关文章
- dotnet core 发布配置(测试数据库和正式数据库自动切换)
一.起源 在进行项目开发时,常常要求开发环境,测试环境及正式环境的分离,并且不同环境运行的参数都是不一样的,比如监听地址,数据库连接信息等.当然我们把配置信息保存到一个文件中,每次发布的时候,可以先修 ...
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
[C#]使用 C# 代码实现拓扑排序 目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...
- dotnet core 开发体验之Routing
开始 回顾上一篇文章:dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的,所以感觉需要研究一下Routing是什么鬼. ...
- dotnet core开发体验之开始MVC
开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- spring cloud+dotnet core搭建微服务架构:Api网关(三)
前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...
- spring cloud+dotnet core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(下)
写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...
- 国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目
部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...
随机推荐
- JSP标签使用的代码记录——《%= %》(神奇的CSDN为啥标题不让打英文的尖括号)
关于JSP的一些标签,在用到的时候有些生疏,就去找了找资源重新温习了一下. 附上两个JSP<%= %>标签的博客,同时也记录当前项目里用到的方法. jsp页面中<%@ %>.& ...
- Spring5源码,Spring DispatecherServlet的生命周期
一.前端控制器模式 二.DispatcherServlet的执行链 三.DispatcherServlet 1.策略初始化 2.请求预处理 3.请求处理 4.视图解析 5.处理调度请求 - 视图渲染 ...
- 3.DHCP原理
1.DHCP服务器给首次接入网络的客户端分配网络参数的工作原理 只有跟DHCP客户端在同一个网段的DHCP服务器才能收到DHCP客户端广播的DHCP DISCOVER报文.当DHCP客户端与DHCP服 ...
- 高效团队的gitlab flow最佳实践
当前git是大部分开发团队的首选版本管理工具,一个好的流程规范可以让大家有效地合作,像流水线一样有条不紊地进行团队协作. 业界包含三种flow: Git flow Github flow Gitlab ...
- CCF CSP 202009-2 风险人群筛查
202009-2 风险人群筛查 题目背景 某地疫情爆发后,出于"应检尽检"的原则,我们想要通知所有近期经过改高危区域的居民参与核酸检测. 问题描述 想要找出经过高危区域的居民,分析 ...
- 自定义 ocelot 中间件输出自定义错误信息
自定义 ocelot 中间件输出自定义错误信息 Intro ocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候 ...
- CF-1440C2 Binary Table (Hard Version) (构造,模拟)
Binary Table (Hard Version) 题意 \(n*m(2\le n,m\le 100)\) 的01矩阵,每次可以选择一个宽度为2的子矩阵,将四个位置中的任意3个进行翻转,即0变1, ...
- N皇后解法以及位运算优化
N皇后解法以及位运算优化 观察棋盘,要求皇后之间不能处在同行同列同一条斜线,求使得每行都有一个皇后的放置方法共有多少种. 每尝试放置一个皇后,都可以把该位置所在的行.列标号用一个数组标记,含义表示该行 ...
- Codeforces Round #652 (Div. 2) B. AccurateLee(字符串)
题目链接:https://codeforces.com/contest/1369/problem/B 题意 给出一个长 $n$ 的 二进制串,每次可以选择字符串中的一个 $10$,然后删除其中的一个字 ...
- 同时拿到BATJMD的Offer是怎样的一种体验?
写在前面 又到了收割Offer的季节,你准备好了吗?曾经的我,横扫各个大厂的Offer.还是那句话:进大厂临时抱佛脚是肯定不行的,一定要注重平时的总结和积累,多思考,多积累,多总结,多复盘,将工作经历 ...