写点什么

.NET5 发布,这个微软“全家桶”会是.NET 的春天吗?

发布于: 2020 年 11 月 25 日
.NET5发布,这个微软“全家桶”会是.NET的春天吗?

在全面开源的步伐下,微软也逐步跟上了脚步,作为微软最早迈向开源的重要软件之一,.NET 5 的发布对微软及其使用者都具有重要意义。


微软未来目标是将所有的 .NET 组件整合到一个产品下,然后用户可以根据需求使用 .NET 的某个部分,而不是单独下载或安装所有内容。


对于 Visual Studio 用户,需要 Visual Studio 16.8 或更高的版本才能在 Windows 上使用.NET 5.0,在 MacOS 上使用最新版本的 Visual Studio for Mac)。Visual Studio Code 的 C#扩展也已经支持.NET5.0 和 C#9。


NET 5.0 是.NET 统一之旅的第一个版本。微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上,为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。


版本发布时间轴:



.NET Core 3.0 已于 2019/09 推出


.NET Core 3.1 已于 2019/12 推出,为 LTS (Long Term Support,长期支援版),之后.NET Core 将更名.NET,固定每年释出新版,并定义双数版号为 LTS 版,单数版号为 Current 版。


.NET 5.0 2020/11


.NET 6.0 LTS 2021/11


.NET 7.0 2022/11


.NET 8.0 LTS 2023/11


如有兴趣,可以体验一下,历来发布资料及地址:https://dotnet.microsoft.com/download/dotnet/5.0




.NET 5.0 是.NET Framework 和.NET Core 核心的结合,旨在统一.NET 平台。.NET 5.0 毫无疑问代表的是.NET 的未来,但是目前国内大部分企业使用的依然是.NET Framework,不过长期来看,升级似乎不可避免。



为了充分论证.NET5 的性能,自首个预览版发布以来微软已经进行了广泛的内部部署,除了在 .NET 5.0 上运行.NET 网站外,Bing 也在使用这个新平台。


并在此次更新中强调了一些比较显著的变化,包括一些性能上的改进。


以下是微软发布的此版本的相关亮点:


1..NET 5.0 已经部署到 http://dot.nethttp://Bing.com 托管数月,已经得到了实战检验。


2.很多组件的性能都得到了极大的提高。.NET 5.0 中 ARM64 的性能 和 GRPC 等都有改善


3.C# 9 和 F# 5 提供了新的语言改进,如 C# 9 的顶层程序和记录,而 F# 5 则提供了交互式编程和.NET 上功能编程的性能提升。


4..NET 库对 Json 序列化、正则表达式和 HTTP(HTTP 1.1、HTTP/2)的性能有所提升。它们现在也被完全注释为可空性。


5.由于 GC、分层编译等方面的完善,P95 延迟有所下降。


6.应用部署选项更好了,有了 ClickOnce 客户端应用发布、单文件应用、容器镜像尺寸减小,并增加了 Server Core 容器镜像。


7.平台范围扩大,增加了 WindowsArm64 和 WebAssembly。


8.一个值得注意的变化是,.NET 5.0 应用可以原生运行在 ARM64 Windows 设备上,消除了仿真带来的一些性能障碍。然而,在这个版本中,Windows 桌面组件并不能用于 ARM64 设备--这计划在.NET 5.0 的服务更新中进行。


近几年.NET Core 的开源项目也非常活跃,随着.net5 的发布,这些项目将会逐步整合到.net5 及之后的版本中。


但是有几点需要特别注意:


目前的.NET5 虽然已经足够强,但严格来说依然属于实现阶段,.NET6.0 或许更值得期待。


目前关于.net5 的挺多升级并未在实际中讨论,例如正则性能提升,静态正则缓存;Kestrel 的通信性能提升,支持 Http3; 证书互转,增强 SSL 通信;readonly struct 在内部的应用;HttpClient 人性化的 Api,支持 webassembly, 支持序列化结果,支持 Quic 等;Json 支持字段序列化,只读类型序列化,Web 类型序列化,循环引用序列化等特性;GC 可分配 no zero 的内存空间,分配“固定住”的大堆空间,GCMemoryInfo 等等。


如果并没有急切的需求,目前并不建议升级至 5.0,可以将 5.0 作为研究跳板,在明年微软发布 6.0LTS 长期维护版本的时候再考虑升级,降低风险。当然,这个需要根据实际情况进行评估。


......


接下来,放一个.NET Core3.1 升级.NET5 可能遇到的坑,以作参考,不需要的可以略过此部分,作者“dotnet 跨平台”。



此前 Scott Hunter 在博客信誓旦旦.NET Core3.1 平滑迁移.NET5,于是当天就去升级我的宝藏项目,结果是大坑没有,小坑不断,折腾了一天时间才搞定,下面来仔细捋一捋,给搭建提供点参考。


背景介绍


升级的项目是之前开源在 Github 上,也曾一周新增 300star,后面虽因故关闭了,但我个人是非常用心的。这不.NET5 刚发布,第一时间就开始了升级。


项目是个微信小程序商城,后端是微服务架构支撑的,Ocelot 网关+Consul 服务注册发现+Core WebApi+gRPC+IdentityServer4 都安排上了,整体还是比较复杂的,MongoDB、Redis、RabbitMQ 也都安排上了,然后就在.NET Core3.1 升级.NET5 的过程中,各种踩坑。



VS 升级坑


升级的第一个坑来自于 VS 工具升级!之前.NET5 预览版、RC1、RC2 都是用的 Visual Studio 2019 Preview,这会儿.NET5 正式版发现只需要把 Visual Studio 2019 升级到 V16.8 即可,然后就兴冲冲的升级去了,结果当头一棒:Visual Studio Installer 提示网络未连接无法下载!当然不是我的网络问题,其实是 DNS 解析上出了毛病(部分用户会遇到,解决办法是把电脑的 DNS 设置为 8.8.8.8 即可),但毕竟当时是 11 号凌晨,以为是微软官方同步不够,我就选择换工具,直接去 Linux 下用 VS Code 升级了,然后就开始了第二波环境坑!


经验:如果遇到 Visual Studio Installer 提示网络未连接无法下载,可以将当前电脑 DNS 设置为 8.8.8.8 即可


Linux 环境坑


Linux 环境下 VS Code 开发之前都蛮熟悉了,这次想着是升级.NET5,就顺手把 Linux 系统从 CentOS7 给换成了 CentOS8,然后又华丽丽的各种坑。比如 CentOS8 中网卡名字从 ens33 变成了 eth0,用 nftables 替代 iptables,各种小变化让人防不胜防,然后 docker 最新版本的命令也跟之前有些小变化,导致之前整理的 Linux+Docker 操作笔记各种失灵,来来回回折腾了好几个小时。


当然,环境只是环境,折腾完就过去了,而代码迁移层面的坑才是最麻烦的,因为并不知道还有多少没发现!



.NET5 迁移坑坑坑


项目从.NET Core3.1 升级到.NET5 非常 easy,在 global.json 中将 SDK 版本从 3.1 升级成 5.0,再将 TargetFramework 从 netcoreapp3.1 换成 net5.0 即可。还有部分类库命名空间变化完全没关系,宇宙第一 IDE 的智能提示轻松解决。但是,在真实项目迁移过程中,我却遇到了各种小问题:


1.Core WebApi 框架模板项目中默认集成了 swagger,这个是新增的,但之前项目有一些自定义配置和扩展,也导致了冲突。


2.IdentityServer4 第三方框架版本升级,API 变化很有点多,改动不了不少代码,这个锅虽然不是.NET5 的,但也是升级项目会遇到的。


3.尝试 C#9 花了一些时间,想体验下新语法新特性,如 Native ints 原生 Ints、Pattern matching improvements 模式匹配改进版,结果几次把自己绕进去了。


4.项目升级完发现的 Bug,DateTime 这个天天见的值出现了变化,在 ASP.NET Core 3.1 及更早版本中,DateTime 绑定的是服务器本地时间,而 5.0 之后,DateTime 绑定的是 UTCTime。


Learun.net


用户头像

敏捷开发很认真! 2020.05.20 加入

www.learun.cn

评论

发布
暂无评论
.NET5发布,这个微软“全家桶”会是.NET的春天吗?