.NET项目迁移到.NET Core操作指南

  这篇文章,汇集了大量优秀作者写的关于".NET迁移到.NET Core"资料文章以及微软官方教程文档。是我在迁移公司框架项目到.NET Core.NET Standard时遇到的问题,并将相关资料整理成这篇文章。记录如何一步一步把项目迁移到.NET Core。

在此感谢这些革命前辈,填平的坑,走出的路……

.NET Core提供的特性

  1. 1.开源、免费

  2. 2.轻量级、跨平台

  3. 3.组件化、模块化、IOC+Nuget、中间件

  4. 4.高性能

  5. 5.统一了MVCWebAPI编程模型

  6. a) 比如:ASP.NET Core MVC Web API 直接或间接继承同一个基类 ControllerBase,提供可使用的API也一致化

  7. b) 比如:旧ASP.NET时代,写全局filter需要针对MVC Web API 分别编写代码,但在ASP.NET Core,直接使用一套中间件代码即可

  8. 6.可测试性

  9. 7.微服务、容器化支持

  10. 8.标准化 .NET API 规范- .NET STANDARD,整体架构如下图:

640?wx_fmt=jpeg

.NET Core性能提升

  1. 1.TechEmpower机构

  TechEmpower机构会定期对各语言主流的web框架做性能测试

  https://www.techempower.com/benchmarks/

640?wx_fmt=png

  1. 2.博客园博主、微软MVP – 杨晓东,做的 “Hello World”性能测试

  2. ASP.NET Core 1.1性能对比评测(ASP.NET,Python,Java,NodeJS)

编号

对比方

系统环境

宿主环境

测试结果(QPS

1

ASP.NET Core vsASP.NET Core

Windows

Kestrel vs IIS

45.6k vs 15.2k

2

ASP.NET Core vsASP.NET

Windows

IIS vs IIS

15.2k vs 18.2k

3

ASP.NET Core vsASP.NET

Windows

Kestrel vs IIS

45.6k vs 18.2k

4

ASP.NET Core vs Python Django

Linux

Kestrel vs uwsgi

26.7k vs 1.57k

5

ASP.NET Core vs Java Servlet

Linux

Kestrel vs Tomcat

26.7k vs 18.3k

6-1

ASP.NET Core vsNodeJS Express

Linux

Kestrel vs self host

26.7k vs 15.6k

6-2

ASP.NET Core vsNodeJS Koa

Linux

Kestrel vs self host

26.7k vs 17.5

640?wx_fmt=png

性能测试工具:

    微软出品:Benchmarks

    https://github.com/aspnet/benchmarks

其他阅读:

    是什么优化让 .NET Core 2.0性能飙升?

    .NET Core 3中的性能提升(译文)

    Java(11,12) 与 .NET Core(2.2,3.0)的性能对比测试

迁移工作量评估(API兼容性分析)

度量.net framework 迁移到.net core的工作量

可移植性分析工具:.NET Portability Analyzer

 【Cli 版本】  【Visual Studio Extension 版本】

  评估会给出类似如下报告:

640?wx_fmt=png

640?wx_fmt=png

  .NET Standard Versions

640?wx_fmt=jpeg

迁移方案制定

微软官方《组织项目以支持 .NET Framework 和 .NET Core》文章中,有介绍两种迁移方案:

方案一、将现有项目和 .NET Core 项目合并为单个项目(多目标框架)

方案二、将现有项目和新的 .NET Core 项目分离(拷贝到新项目)

通过类名、命名空间,查询API的实现信息

迁移过程中,有类库命名空间被调整,nuget归属包被调整,具体类库在.NET Core哪个版本中被实现也不是很清楚,通过下面两个查询助手,即可解决这些问题。

1、查询命名空间、类库在哪个nuget package包中定义(第一次查询比较慢)

2、查询 NET API 在各版本中实现

结果图如下:

640?wx_fmt=png

640?wx_fmt=png

类库项目、应用项目如何选择框架类型

  1. 1.如何组织一个同时面向多目标框架的 C# 项目解决方案

  2. 2..NetStandard;.netCore;FX(.NetFrameWork)之间引用关系

 .NET Standard 2.0中,我们使在 .NET Standard 库中通过一个兼容层去引用已有的 .NET Framework 的库成为可能。当然,这只对那些只使用了适用于 .NET Standard API  .NET Framework 库有效。

640?wx_fmt=png

FX引用.NetCore:不通过

.NetStandard引用.NetCore:不通过

.NetCore引用FX:通过

.NetCore引用.NetStandard:通过

.NetStandard引用FX:通过

FX引用.NetStandard:通过

具体参见:

  【译】介绍 .NET Standard -- 【原文】

  关于.net core 和 .net fx相互引用的问题

.NetStandard;.netCore;FX(.NetFrameWork)之间引用关系

  1. 3.项目支持多目标框架

支持多目标框架,并解决第三方库引用差异的问题(在 csproj 文件中指定包含条件)

目标框架名称列表 (命名全小写)

如何调试多目标框架类库?

NET Standard/Core项目使用条件判断输出多版本xml注释文档

640?wx_fmt=png

  1. 4.多目标框架中共享代码方案

1、【首选】.NET Standard,需要目标SDK支持对应的 .NET Standard 版本。

2、共享项目。直接共享了源码,只要在目标项目中指定了条件编译符,那么源码便能针对各种不同的目标框架进行分别编译。

3、[add as link]使用链接共享 Visual Studio 中的代码文件

  1. 5.条件编译符号 (命名全大写)

指令: #if #elif #else #endif ||&&!

因为目标框架提供的API不相同。故必要时可添加条件编译符号以便支持不同的运行时版本。

微软有针对各个目标框架有预定义预处理器符号,vs编译时会自动识别到这些框架条件编译符号。

.NET Framework 4.5 --> NET45

.NET Framework 4.6 --> NET46

.NET Framework 4.6.1 --> NET461

.NET Standard 1.0 --> NETSTANDARD1_0

.NET Standard 1.6 --> NETSTANDARD1_6

.NETCOREAPP 2.0 --> NETCOREAPP2_0

参考:

#if指令文档

如何将条件编译符号(DefineConstants)传递给msbuild

迁移到.NET Core,但只运行在windows平台上

使用 Windows 兼容性包将代码移植到 .NET Core

如何:将 Windows 窗体桌面应用程序移植到 .NET Core

如何:将 WPF 桌面应用移植到 .NET Core

兼容.NET Core.NET Standard API

迁移HttpHandler与HttpModule到 ASP.NET Core 中间件

.NET CORE 2.0 踩坑记录之ConfigurationManager

.NET Core/Standard 2.0 编译时报“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”错误

  1. 1.自动生成AssemblyInfo的原理

  2. 2.解决方案:不自动创建 AssemblyInfo 文件

  3. ASP.NET Core开发之HttpContext

.net core 使用JsonConvert替代JavaScriptSerializer

ASP.NET Core 中重复读取 Request.Body 的正确姿势

JsonRequestBehaviorcore中被移除的问题

  1. 1.[ASP.NET MVC]解决"若要允许 GET请求,请将 JsonRequestBehavior 设置为AllowGet"

  2. 2.[ASP.NET Core]core中不会抛出AllowGet异常,对于DenyGet则使用[HttpPost]代替

https://stackoverflow.com/questions/38578463/asp-net-core-the-name-jsonrequestbehavior-does-not-exist-in-the-current-cont

https://stackoverflow.com/questions/8464677/why-is-jsonrequestbehavior-needed?r=SearchResults

获取ASP.NET Core中的Web根路径和内容根路径(移除的MapPath)

为什么我的会话状态在ASP.NET Core中不工作了?

由于ASP.NET Core 2.1中引入的Cookie同意和非必要cookieGDPR功能引起。(GDPR,即General Data Protection Regulation,《通用数据保护条例》)

ASP.NET4.5ASP.NET Core中共享cookies认证信息(加解密方式不一致问题)

   .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

   开源方案:[git]idunno.CookieSharing

ASP.NET Core如何获取客户端IP地址(被移除的ServerVariables对象)

ASP.NET Core中 BuildManager.GetReferencedAssembiles() 的替代方案

1AppDomain.CurrentDomain.GetAssemblies()

2https://stackoverflow.com/questions/53989393/is-there-an-alternative-for-buildmanager-getreferencedassemblies-in-asp-net-co

  (可以正常注入使用,但是调试时会报FileNotFoundException

  640?wx_fmt=png

.NET Core 2.0迁移System.Runtime.Caching

迁移EF框架

【微软官方】从 EF6 到 EF Core的迁移系列

【微软官方】EF Core 版本升级迁移系列

修改为 ASP.NET Core 风格的应用

  按照上面的方式修改API兼容性后,框架类库可以顺利迁移到.NET Core,编译通过,代码运行也正常。但是ASP.NET Core风格的应用,其写法也是有很多变化的。具体参考下面文档:

将传统 ASP.NET 应用迁移到 .NET Core

【微软官方】ASP.NET 迁移到 ASP.NET Core教程系列

【微软官方】ASP.NET Core 版本升级迁移系列

  后续,我会再整理一篇 《ASP.NET Core 学习教程》 资源汇总的文章,目的是有条理的汇总大量优秀的ASP.NET Core知识点文章,方便大家学习和知识查找。

640?wx_fmt=jpeg

原文地址:https://www.cnblogs.com/heyuquan/p/dotnet-migration-to-dotnetcore.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

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

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

相关文章

Educational Codeforces Round 88 D. Yet Another Yet Another Task(巧枚举)

cf地址 **题目大意:**一个序列,你可以选择一个子段,要求去掉子段最大值后的和最大,求出这个最大值 **思路:**a[i]的范围比较小,可以通过枚举最大值,再找到最大值可以辐射的区间。经典套路了。…

Codeforces Round #607 (Div. 2) E. Jeremy Bearimy dfs + 思维

传送门 文章目录题意:思路:题意: 给你2∗k2*k2∗k个点的一棵树。定义GGG为任选kkk组不同的点,每组点的距离和的最小值。定义BBB为任选kkk组不同的点,每组点的距离和的最大值。让你求出GGG和BBB。 思路: …

EF Core 3 的 40 个中断性变更

为了修复 Entify Framework Core 中许多已发现的缺陷,微软在 EF Core 3 中引入了 40 个中断性变更。我们可以在微软文档中查看完整的中断性变更列表,本文仅列举几个主要的点。客户端查询为了突破 EF Core SQL 生成器的限制,默认只在客户端执行…

Codeforces Round #646 (Div. 2) E(贪心,bfs)

Codeforces Round #646 (Div. 2) E 题目大意: 给一棵树,每个节点有三个权值 A,B,C, (B,C为0或1),每次你可以花费 A[u] *k的代价让A子树中的任意 k 个节点交换彼此的 B ,问让所有节点的 BC 至少花费多少代价。 思路: …

联手微软,Docker公司将推出Docker Desktop for WSL 2

微软最新推出的 WSL 2 在架构方面发生了重大的变化:它提供了一个在轻量级 VM 中运行的真正 Linux 内核。使用真正的 Linux 内核意味着可以在 Windows 上运行 ELF64 Linux 二进制文件。对 Docker 来说绝对是利好消息,因为这意味着 Linux 版本的 Docker 可…

Educational Codeforces Round 88 (Rated for Div. 2) E(数学)

Educational Codeforces Round 88 (Rated for Div. 2)E 题目大意: 给你n&#xff0c;k(1<k<n<5e5)&#xff0c;从1到n中选k个数组成一个严格递增序列&#xff0c;如果对任何正整数&#xff0c;依次模上这k个数&#xff0c;无论这k个数如何排列得到的答案都相同&#…

HAProxy 2.0发布,长期支持版本

HAProxy 2.0 发布了。HAProxy 是一个使用 C 语言编写的自由及开源软件&#xff0c;其提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的 Web 负载均衡解决方案。包括 GitHub、Bitbucket、Stack Overflow、R…

Codeforces Round #651 (Div. 2) D

D. Odd-Even Subsequence 题目大意&#xff1a;在a数组中 保留k个数字&#xff0c;如何代价最小的多少。 代价的算法 具体看题意&#xff1a;就是k数组中 min{max{奇数下标}&#xff0c;max{偶数下标}} 解题思路&#xff1a;贪心加二分&#xff0c;二分全部的答案&#xff08…

CF1042E Vasya and Magic Matrix 期望dp + 推公式

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 将矩阵中的数放到数组里排序&#xff0c;就是一个比较明显的期望dpdpdp了。 定义f[i]f[i]f[i]表示从第iii个出发的期望得分&#xff0c;所以转移方程也比较好写了&#xff1a;f[i]∑(f[j](…

C#并发编程之异步编程(一)

写在前面C#5.0中&#xff0c;对异步编程进行了一次革命性的重构&#xff0c;引入了async和await这两个关键字&#xff0c;使得开发人员在不需要深刻了解异步编程的底层原理&#xff0c;就可以写出十分优美而又代码量极少的代码。如果使用得当&#xff0c;你可以写出具有并行化并…

P4316 绿豆蛙的归宿 期望dp + DAG

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先要发现这是一个DAGDAGDAG图&#xff0c;让后我们可以用拓扑在图上跑期望dpdpdp。 定义f[i]f[i]f[i]表示iii到nnn的期望路径长度&#xff0c;知道终止状态f[n]0f[n]0f[n]0&#xff0c;所…

程序员修神之路--高并发下如何缩短响应时间

点击上方“蓝字”带你去看小星星菜菜哥&#xff0c;请你看电影呀&#xff0c;但是得帮我一个忙好呀&#xff0c;看什么&#xff1f;哥斯拉2&#xff1a;怪兽之王看过了~X战警&#xff1a;黑凤凰看过了追龙2和黑衣人呢&#xff1f;都看过了&#xff0c;你说帮什么忙吧我一个网站…

URAL - 1732 Ministry of Truth--kmp算法的应用(kmp模板)

题目大意&#xff1a;首先给你第一串字符串&#xff08;s1&#xff09;&#xff0c;让你删到一些字母&#xff0c;变成下面的字符串(s2)&#xff0c;删除的字母会变成字符‘_’; 思路&#xff1a;用kmp算法让s1每一个单词在s1上匹配&#xff0c;从前面开始找&#xff0c;记得匹…

从SQL Server到多数据库,微软数据库迁移全攻略

据了解&#xff0c;截止到 2022&#xff0c;云迁移市场规模将达到 1290 亿美元&#xff0c;云迁移服务市场的利润率达 26.7%。数据库作为企业迁移上云的关键环节&#xff0c;自然成为了各大云厂商关注的重点&#xff0c;除了提供各种各样的云端数据库&#xff0c;迁移服务也是云…

C#并发编程之异步编程(二)

写在前面前面一篇文章介绍了异步编程的基本内容&#xff0c;同时也简要说明了async和await的一些用法。本篇文章将对async和await这两个关键字进行深入探讨&#xff0c;研究其中的运行机制&#xff0c;实现编码效率与运行效率的提升。异步方法描述&#xff1a;使用async修饰符来…

2020牛客暑期多校训练营(第四场)H.Harder Gcd Problem(把1到n分为不互质的数对,找最多的对数)

题目大意&#xff1a;把1到n分为不互质的数对&#xff0c;找最多的对数 思路&#xff1a;先从最大的质因数开始找&#xff0c;因为小的比大的更容易匹配&#xff0c;所以贪心的从大的开始找。 首先要预处理出所以数的最大质因数。 然后根据质因数从大往小找&#xff0c;当质因…

C#规范整理·语言要素

如有不理解&#xff0c;请留言&#xff0c;开始!1. 正确操作字符串拼接字符串一定要考虑使用 StringBuilder ,默认长度为16,实际看情况设置。StringBuilder本质&#xff1a; 是以非托管方式分配内存。同时StringFormat方法 内部也是使用StringBuilder进行字符串格式化。2. 使用…

NetCore服务虚拟化01(集群组件Sodao.Core.Grpc)

一. 起始去年.NetCore2.0的发布&#xff0c;公司决定新项目采用.NetCore开发&#xff0c;当作试验。但是问题在于当前公司内部使用的RPC服务为Thrift v0.9 zookeeper版本&#xff0c;经过个性化定制&#xff0c;支持了异步&#xff0c;但也因为如此&#xff0c;这么多年来一直…

CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 树启 + 状压

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 据说是树启的压轴题。 先观察题意&#xff0c;字符有1−221-221−22中&#xff0c;为什么不是1−261-261−26个&#xff1f;显然他就是让你状压的。我们考虑将每条路径上字符状压成statest…

Codeforces Round #610 (Div. 2) D. Enchanted Artifact 交互 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们发现如果知道了字符串的长度&#xff0c;我们就可以O(n1)O(n1)O(n1)次询问求解出来。比如当前长度为nnn&#xff0c;那么我们就可以构造出一个长度为nnn的全′a′a′a′字符串&…