为什么要从. NET 迁移到. NET Core?...1
.NET Core 提供的特性...1
.NET Core 性能提升...2
.NET 如何迁移到. NET Core?...4
迁移工作量评估(API 兼容性分析)...4
迁移方案制定...4
通过类名, 命名空间, 查询 API 的实现信息...4
类库项目, 应用项目如何选择框架类型...5
迁移到. NET Core, 但只运行在 Windows 平台上...6
兼容. NET Core 或. NET Standard API7
迁移 EF 框架...8
修改为 ASP.NET Core 风格的应用...8
这篇文章, 汇集了大量优秀作者写的关于 ".NET 迁移到. NET Core" 资料文章以及微软官方教程文档. 是我在迁移公司框架项目到. NET Core 和. NET Standard 时遇到的问题, 并将相关资料整理成这篇文章. 记录如何一步一步把项目迁移到. NET Core.
在此感谢这些革命前辈, 填平的坑, 走出的路......
为什么要从. NET 迁移到. NET Core?
.NET Core 提供的特性
1. 开源, 免费
2. 轻量级, 跨平台
3. 组件化, 模块化, IoC+Nuget, 中间件
4. 高性能
5. 统一了 MVC 和 webAPI 编程模型
a)比如: ASP.NET Core 中 MVC 和 Web API 继承同一个基类, 提供可使用的 API 也一致化
b)比如: 旧 ASP.NET 时代, 写全局 filter 需要针对 MVC 和 Web API 分别编写代码, 但在 ASP.NET Core, 直接使用一套中间件代码即可
6. 可测试性
7. 微服务, 容器化支持
8. 标准化 .NET API 规范 - .NET STANDARD, 整体架构如下图:
.NET Core 性能提升
1.TechEmpower 机构
TechEmpower 机构会定期对各语言主流的 Web 框架做性能测试
https://www.techempower.com/benchmarks/
2. 博客园博主, 微软 MVP - 杨晓东, 做的 "Hello World" 性能测试
ASP.NET Core 1.1 性能对比评测(ASP.NET,Python,Java,Node.JS)
编号 | 对比方 | 系统环境 | 宿主环境 | 测试结果(QPS) |
1 | ASP.NET CorevsASP.NET Core | Windows | KestrelvsIIS | 45.6k vs 15.2k |
2 | ASP.NET CorevsASP.NET | Windows | IISvsIIS | 15.2k vs 18.2k |
3 | ASP.NET CorevsASP.NET | Windows | KestrelvsIIS | 45.6k vs 18.2k |
4 | ASP.NET CorevsPython Django | Linux | Kestrelvsuwsgi | 26.7k vs 1.57k |
5 | ASP.NET CorevsJava Servlet | Linux | KestrelvsTomcat | 26.7k vs 18.3k |
6-1 | ASP.NET CorevsNodeJS Express | Linux | Kestrelvsself host | 26.7k vs 15.6k |
6-2 | ASP.NET CorevsNodeJS Koa | Linux | Kestrelvsself host | 26.7k vs 17.5 |
性能测试工具:
微软出品: Benchmarks
https://github.com/aspnet/benchmarks
其他阅读:
是什么优化让 .NET Core 2.0 性能飙升?
.NET Core 3 中的性能提升(译文)
Java(11,12) 与 .NET Core(2.2,3.0)的性能对比测试
.NET 如何迁移到. NET Core?
迁移工作量评估(API 兼容性分析)
度量. net framework 迁移到. net core 的工作量
可移植性分析工具:.NET Portability Analyzer https://github.com/Microsoft/dotnet-apiport
[Cli 版本] [Visual Studio Extension 版本]
评估会给出类似如下报告:
.NET Standard Versions
迁移方案制定
微软官方《组织项目以支持 .NET Framework 和 .NET Core》文章中, 有介绍两种迁移方案:
方案一, 将现有项目和. NET Core 项目合并为单个项目(多目标框架)
方案二, 将现有项目和新的. NET Core 项目分离(拷贝到新项目)
通过类名, 命名空间, 查询 API 的实现信息
迁移过程中, 有类库命名空间被调整, nuget 归属包被调整, 具体类库在. NET Core 哪个版本中被实现也不是很清楚, 通过下面两个查询助手, 即可解决这些问题.
1, 查询命名空间, 类库在哪个 nuget package 包中定义(第一次查询比较慢)
2, 查询 NET API 在各版本中实现
结果图如下:
类库项目, 应用项目如何选择框架类型
1. 如何组织一个同时面向多目标框架的 C# 项目解决方案
2..NetStandard;.netCore;FX(.NetFrameWork)之间引用关系
在. NET Standard 2.0 中, 我们使在. NET Standard 库中通过一个兼容层去引用已有的. NET Framework 的库成为可能. 当然, 这只对那些只使用了适用于. NET Standard API 的. NET Framework 库有效.
FX 引用. NetCore: 不通过
.NetStandard 引用. NetCore: 不通过
.NetCore 引用 FX: 通过
.NetCore 引用. NetStandard: 通过
.NetStandard 引用 FX: 通过
FX 引用. NetStandard: 通过
具体参见:
[译] 介绍 .NET Standard--[原文]
关于. net core 和 .net fx 相互引用的问题
.NetStandard;.netCore;FX(.NetFrameWork)之间引用关系
3. 项目支持多目标框架
支持多目标框架, 并解决第三方库引用差异的问题(在 csproj 文件中指定包含条件)
目标框架名称列表 (命名全小写)
如何调试多目标框架类库?
NET Standard/Core 项目使用条件判断输出多版本 xml 注释文档
4. 多目标框架中共享代码方案
1,[首选] .NET Standard, 需要目标 SDK 支持对应的. NET Standard 版本.
2, 共享项目. 直接共享了源码, 只要在目标项目中指定了条件编译符, 那么源码便能针对各种不同的目标框架进行分别编译.
3,[add as link]使用链接共享 Visual Studio 中的代码文件
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 http://www.voidcn.com/article/p-nsrcccet-btr.html
迁移到. 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. 自动生成 AssemblyInfo 的原理
2. 解决方案: 不自动创建 AssemblyInfo 文件
ASP.NET Core 开发之 HttpContext
.net core 使用 JsonConvert 替代 JavaScriptSerializer
ASP.NET Core 中重复读取 Request.Body 的正确姿势
JsonRequestBehavior 在 core 中被移除的问题
1.[ASP.NET MVC]解决 "若要允许 GET 请求, 请将 JsonRequestBehavior 设置为 AllowGet"
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 同意和非必要 cookie 的 GDPR 功能引起.(GDPR, 即 General Data Protection Regulation,《通用数据保护条例》)
在 ASP.NET4.5 和 ASP.NET Core 中共享 cookies 认证信息(加解密方式不一致问题)
- https://www.cnblogs.com/cmt/p/5940796.html
- https://github.com/blowdart/idunno.CookieSharing
ASP.NET Core 如何获取客户端 IP 地址(被移除的 ServerVariables 对象)
在 ASP.NET Core 中 BuildManager.GetReferencedAssembiles()的替代方案
- ,AppDomain.CurrentDomain.GetAssemblies()
- ,https://stackoverflow.com/questions/53989393/is-there-an-alternative-for-buildmanager-getreferencedassemblies-in-asp-net-co(可以正常注入使用, 但是调试时会报 FileNotFoundException)
.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 知识点文章, 方便大家学习和知识查找.
==============================================================================
over, 谢谢查阅, 觉得文章对你有收获, 请多帮推荐. 欢迎提供更好的资料信息.
来源: https://www.cnblogs.com/heyuquan/p/dotnet-migration-to-dotnetcore.html