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_0result = "NET6.0";
#elif NET5_0result = "NET5.0";
#elif NETCOREAPP3_1result = "NETCOREAPP3_1";
#elif NETCOREAPP3_0result = "NETCOREAPP3_0";
#elif NETCOREAPP2_1result = "NETCOREAPP2_1";
#elif NETSTANDARD2_1result = "NETSTANDARD2_1";
#elif NETSTANDARD2_0result = "NETSTANDARD2_0";
#endifreturn 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:

EOL-warning

所以在项目文件中配置了 <NoWarn>;NETSDK1138</NoWarn> 来忽略这个警告

测试代码很简单,直接调用类库示例中的测试方法:

Console.WriteLine(Test.GetResult());Console.WriteLine("Hello World!");
Console.ReadLine();

Test Output

接着我们就来测试吧,先思考一下吧,不同的 TargetFramework 输出的结果分别是什么呢?

net6.0

net6.0

net5.0

net5.0

netcoreapp3.1

netcoreapp3.1

netcoreapp3.0

netcoreapp3.0

netcoreapp2.1

netcoreapp2.1

netcoreapp2.0

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)

输出结果如下:

从上面的结果来看,实际的解析结果运行结果都是根据最终执行到的类库结合应用当前运行框架来决定使用哪个版本的代码的

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...

转载请注明出处&#xff1a;http://blog.csdn.net/xdz78#include #include //查找单链表中的特定元素&#xff0c;《数据结构与算法——c语言描述》 3.11 答案int count;//全局变量自动初始化为0int m;//需要查找的元素大小typedef struct student {int data;struct student *n…

python调用robotframework_robotframework+python接口自动化的点滴记录(2)

1.在循环体内&#xff0c;赋值语句的前后名称不能一样&#xff0c;否则在跑循环的第二次时就会报错&#xff1a;TypeError: not all arguments converted during string formatting这样写是错的&#xff1a;${设置计划接口_请求body} string format ${设置计划接口_请求body}…

这种感觉真爽

今天接到客户的修改需求&#xff0c;说了一大段话&#xff0c;然后我们开始讨论解决方案。最后自己来负责前台的修改。看了六七个小时的代码&#xff0c;最后修改了一行。达到了要求。想起了以前课文中学到的一句话&#xff1a;画一条线1美元&#xff0c;知道在哪里画这条线999…

大数据时代,掌握数据分析需要做到这几点

这些年来&#xff0c;随着进入大数据时代&#xff0c;各行各业均有一个词频频被提到&#xff0c;那就是数据分析。那么数据分析究竟是什么呢&#xff1f;数据分析就是指用适当的统计分析方法对收集来的大量数据进行处理分析&#xff0c;提取有用信息并形成结论&#xff0c;从而…

93.7%的程序员!竟然都不知道Redis为什么默认16个数据库?

背景在实际项目中redis常被应用于做缓存&#xff0c;分布式锁/消息队列等。但是在搭建配置好redis服务器后很多朋友应该会发现和有这样的疑问&#xff0c;为什么redis默认建立了16个数据库&#xff0c;16个数据库的由来redis是一个字典结构的存储服务器&#xff0c;一个redis实…

python tablewidget 颜色_QT中,QTableView鼠标移动到item上时该item所在行的背景颜色变成其他颜色,这要怎么实现...

展开全部//不解释&#xff0c;自己看。不保证完整&#xff0c;仅供思路参考#include #include "TableView.h"#include #include int main(int argc, char *argv[]){QApplication a(argc, argv);QStandardItemModel model;for ( int col 0; col {QList list;for ( in…

java8 垃圾 不同_【不同的Java垃圾回收器的比较】

现在已经是2014年了&#xff0c;但是对大多数开发人员而言有两件事情仍然是个谜——java垃圾回收以及异性(码农又被嘲笑了)。由于我对后者也不是特别了解&#xff0c;我想我还是试着说说前者吧&#xff0c;尤其是随着Java8的到来&#xff0c;这个领域也发生了许多重大的变化及提…

。。。第一次。。。

记得第一次给你发短信。。问你。。数据结构期末考试有没有范围啊。。没有告诉你。。那次只是给你发短信的借口。。记得第一次打电话给你。。问你。。那个。。什么什么。。的那道题。。你会做吗。。第一次在电话里听你的声音。。是那样的甜美。。记得第一次和安子。阿昆吃饭的时…

“一边熬夜一边求不要猝死”,90后养生朋克指南,条条扎心!

随着一批又一批的90后步入中年秃头、失眠、衰老...健康的压力如影如随是时候开始养生朋克了当代青年&#xff1a;养生朋克指南养生朋克一边作死一边自救的养生方式比如一边熬夜一边涂贵价护肤品用最贵的眼霜 熬最长的夜心理活动经常是&#xff1a;一边熬夜一边祈祷自己不要猝死…

EntityFramework Core查询数据基本本质

【导读】在EntityFramework Core中、当查询出数据后&#xff0c;是如何将数据映射给实体的呢&#xff1f;本节我们预先做个基本探讨&#xff0c;后续给出其底层原理本质前不久&#xff0c;我们在探索性能时&#xff0c;给出利用反射达到性能瓶颈时的方案即使用委托&#xff0c;…

pythonmt4通讯swot矩阵_swot分析矩阵范例(各部门)

优势(Strengths)S1.团队工作氛围和谐融洽&#xff0c;作风吃苦耐劳&#xff0c;积极主动、自我改进意识强S2.品质管控专业人才工作能力强、沟通能力强&#xff0c;执行力坚决S3.产品质量管控体制、流程健全&#xff0c;拥有质量监督管控权S4.产品检测、试验设备齐全&#xff0c…

2009从知到行知识管理培训公开课最后一期

由知识管理中心&#xff08;Knowledge Management Center&#xff09;举办的“从知到行&#xff1a;知识管理理论与实施”培训班第十六期将于2009年11月26-27日于北京举办&#xff0c;这也是KMC举办的2009年最后一期面向CKO、知识管理总监、经理和知识管理专员等知识管理实施人…

java socket 多次write_java NIO2异步socket的write事件与read事件的完成次数不一致是怎么回事...

引用来自“Black_JackQ”的评论异步的&#xff0c;client需多次read处理完数据。是这样做的&#xff0c;但是目前观察消息接受率只有70%左右&#xff0c;代码如下&#xff1a;socket.read(byteBuffer, null, new CompletionHandler() {Overridepublic void completed(Integer r…

万级 K8S 集群背后,etcd 如何保持稳定性?

这几年&#xff0c;随着 Kubernetes 成为容器编排领域霸主&#xff0c;etcd 越来越火&#xff0c;GitHub star 已超过 34.2K。这与它的应用场景广泛密不可分&#xff0c;从服务发现到分布式锁&#xff0c;从配置存储到分布式协调&#xff0c;可以说&#xff0c;etcd 已成为云原…

mysql 10分钟一聚合_SQL-根据DateTime查询多个聚合-MySQL

这是一个复杂的过程.但是我有一个表,其中包含一个DATETIME字段,以及一些其他的int和float字段,需要对其求和并求平均值.我们希望基于时间戳在此表上进行求和和平均,最终旨在开发3个在某种意义上可以相互补充的查询.所以能力看起来像这样TIMESTAMP |subj_diff| SCR2 | SCR32011-…

qdialog 只有点击才能获得焦点_4 个突破点,让你的 Banner 点击率提升10倍

双 11 刚过&#xff0c;双 12又来了每年这个时候作为一名设计师&#xff0c;真的很难...老板压着做电商 banner还有很多人指指戳戳让你改稿好不容易按照别人的想法过稿结果banner 的点击率还不高其实&#xff0c;只需要稍微调整视觉重点你的电商banner 就会变得变得更吸引人&am…

判断文件是否存在一个API函数

一、声明&#xff08;方式有两种&#xff09;: 1. functionPathFileExists(pszPath:string):Bool;stdcall;externalshlwapi.dllNamePathFileExistsA;2. functionPathFileExistsA(pszPath:string):Bool;stdcall;externalshlwapi.dll;二、使用&#xff08;此处用第二种方式&#…

穿背心的老院士,86岁,重病,还在敲代码,单手!

昨天有幸看到了一个视频&#xff0c;视频中&#xff0c;一位老先生穿着朴素的白背心&#xff0c;伏在桌上&#xff0c;对着电脑&#xff0c;一手按着写满密密麻麻数学公式的本子&#xff0c;另一只手仅用单指吃力又缓慢地按着键盘。老先生全神贯注地研究他是 “背心院士” 高伯…

百度广告点击软件_结束了,百度 “毒瘤” 广告!

“ 通过本文&#xff0c;你可以获取一款上网必备的插件&#xff0c;让你摆脱各种"毒瘤"广告。”大家天天逛网页&#xff0c;最恼人的也就是广告了吧。尤其是百度搜索时。01—毒瘤广告有多愁&#xff1f;百度广告有多可怕&#xff0c;小哥哥给你演示一下。百度搜“智齿…

java跳转画面后画面白了_如何跳转指定页面后再次跳转到另一页面或原来的页面...

c#图解教程第5版数万读者认可的新99.33元(需用券)去购买 >这里可以采用redirect以get形式向指定页面发出get请求&#xff0c;指定页面完成后会再次跳转到redirect后边指定的页面(注意&#xff1a;这里的redirect只是一个自定义参数&#xff0c;并不是自带的&#xff0c;名称…