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

这篇文章,汇集了大量优秀作者写的关于".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 直接或间接继承同一个基类 ControllerBase,提供可使用的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,NodeJS)

编号

对比方

系统环境

宿主环境

测试结果(QPS)

1

ASP.NET Core vs ASP.NET Core

Windows

Kestrel vs IIS

45.6k vs 15.2k

2

ASP.NET Core vs ASP.NET

Windows

IIS vs IIS

15.2k vs 18.2k

3

ASP.NET Core vs ASP.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 vs NodeJS Express

Linux

Kestrel vs self host

26.7k vs 15.6k

6-2

ASP.NET Core vs NodeJS Koa

Linux

Kestrel vs self 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

【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

迁移到.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认证信息(加解密方式不一致问题)

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

开源方案:[git]idunno.CookieSharing

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

如何获取项目依赖的所有程序集

方案一:AppDomain.CurrentDomain.GetAssemblies(),此办法不能获取到所有依赖的程序集,因为.Net有延迟加载程序集机制

方案二:适用于传统ASP.NET项目,System.Web.Compilation.BuildManager.GetReferencedAssemblies();

方案三:适用于ASP.NET Core项目,DependencyContext.Default.CompileLibraries,具体代码参考下面

参考:

AppDomain.CurrentDomain.GetAssemblies()

Is there an alternative for BuildManager.GetReferencedAssemblies() in ASP.NET Core?

.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 版本升级迁移系列

(转)项目迁移_.NET项目迁移到.NET Core操作指南的更多相关文章

  1. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  2. Solr4.2迁移到新项目下异常:java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>

    由于业务调整,需要将solr搜索项目集成到另一个项目下成为一个模块,原项目运行异常,但是迁移到新项目后出现异常如下: 原因:引入的httpclient.jar冲突 解决方法:删除冲突的jar

  3. 项目从.NET 4.5迁移到.NET 4.0遇到的问题

    当把项目从.NET 4.5迁移到.NET 4.0时,遇到的问题和解决如下: 在"属性--应用程序--目标框架"设置成.NET 4.0版本. 重新生成项目,报有关EF的错: 卸载掉项 ...

  4. 迁移HTML5移动项目到PhoneGap

    MyEclipse开年钜惠 在线购买低至75折!立即开抢>> [MyEclipse最新版下载] 一.创建一个新的PhoneGap应用程序项目 PhoneGap应用程序项目的结构与HTML5 ...

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

    为什么要从.NET迁移到.NET Core? .NET Core提供的特性 .NET Core性能提升 .NET如何迁移到.NET Core? 迁移工作量评估(API兼容性分析) 迁移方案制定 通过类 ...

  6. 2019-10-15-从以前的项目格式迁移到-VS2017-新项目格式

    title author date CreateTime categories 从以前的项目格式迁移到 VS2017 新项目格式 lindexi 2019-10-15 14:9:27 +0800 20 ...

  7. MyEclipse移动开发教程:迁移HTML5移动项目到PhoneGap(二)

    MyEclipse开年钜惠 在线购买低至75折!立即开抢>> [MyEclipse最新版下载] 二.将文件从HTML5项目复制到PhoneGap项目中 1. 在HTML5 app项目的ww ...

  8. mysql 客户无感知迁移_亿级账户数据迁移,不用数据库工具还能怎么搞?

    原标题:亿级账户数据迁移,不用数据库工具还能怎么搞? 背景 在阿里巴巴内部"大中台,小前台"的组织和业务体制,使前线业务更加敏捷,赋能业务积极迎接未来挑战和机遇,在阿里大中台能力建 ...

  9. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

    前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...

随机推荐

  1. Markdown 打出上下标

    1. 打上标,下标 2<sup>10</sup> <!--下标--> 2.同时打上下标 $x^p_ {ij}$ <!--上标为p,下标为ij,{}是用来组合i ...

  2. 14、Docker监控方案(Prometheus+cAdvisor+Grafana)

    上一篇文章我们已经学习了比较流行的cAdvisor+InfluxDB+Grafana组合进行Docker监控.这节课来学习Prometheus+cAdvisor+Grafana组合. cAdvisor ...

  3. Monkey框架(基础知识篇) - monkey事件介绍

    Monkey所执行的随机事件流中包含11大事件,分别是触摸事件.手势事件.二指缩放事件.轨迹事件.屏幕旋转事件.基本导航事件.主要导航事件.系统按键事件.启动Activity事件.键盘事件.其他类型事 ...

  4. mysql性能测试-------重要!!!

    我们在做性能测试的目的是什么,就是要测出一个系统的瓶颈在哪里,到底是哪里影响了我们系统的性能,找到问题,然后解决它.当然一个系统由很多东西一起组合到一起,应用程序.数据库.服务器.中中间件等等很多东西 ...

  5. spark性能优化----缓存清除

    spark是一款优秀的框架,计算性能相当优异,已经发展成大数据主流计算引擎,在spark开发过程中有很多优化的点.其中去除重复计算是非常重要的.一般操作调用cache/persist,来缓存中间结果, ...

  6. 必须要注意的 C++ 动态内存资源管理(六)——vector的简单实现

    必须要注意的 C++ 动态内存资源管理(六)——vector的简单实现 十六.myVector分析         我们知道,vector类将其元素存放在连续的内存中.为了获得可接受的性能,vetor ...

  7. Eclipse新项目检出后报错第一步:导入lib中的jar包【我】

    新检出项目报错,第一步,先看项目 web-info下的 lib目录里的包是不是都添加到项目构建中了,可以全选先添加到项目构建中,看项目是否还在报错.

  8. Nginx 配置 stream SSL 第四层 代理

    场景:服务器F针对访问终端需要添加白名单操作,由到终端数量较多,所以用了一台代理服务器 P,在服务F中添加 服务器P IP地址的白名单,所有终端访问服务器P 由于我已经安装过 Nginx 所以只需要添 ...

  9. k8s记录-不同集群服务互联

    1.外部访问内部服务 添加nodePort 修改type:ClusteIP为type:NodePort 2.内部服务访问外部服务 kubectl create -f test.yaml apiVers ...

  10. gdb命名记录

    gdb常用命令 显示类 info locals 显示当前局部变量 info args 显示当前函数的参数 info sharedlibrary 显示当前程序依赖的动态库 ptype val 打印变量类 ...