.NET项目迁移到.NET Core操作指南
迁移到.NET Core,但只运行在windows平台上... 6
兼容.NET Core或.NET Standard API7
这篇文章,汇集了大量优秀作者写的关于".NET迁移到.NET Core"资料文章以及微软官方教程文档。是我在迁移公司框架项目到.NET Core和.NET Standard时遇到的问题,并将相关资料整理成这篇文章。记录如何一步一步把项目迁移到.NET Core。
在此感谢这些革命前辈,填平的坑,走出的路……
为什么要从.NET迁移到.NET Core?
.NET Core提供的特性
1.免费和最宽松的开源协议
.NET Core从属于.NET基金会,由微软进行官方支持。使用最宽松的MIT和Apache 2开源协议,文档协议遵循CC-BY。这将允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。唯一的限制是,软件中必须包含上述版权和许可提示,后者协议将会除了为用户提供版权许可之外,还有专利许可,并且授权是免费,无排他性的(任何个人和企业都能获得授权)并且永久不可撤销,用户使用.NET Core完全不用担心收费问题,你可以很自由的部署在任何地方.
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
其他阅读:
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 Framework 和 .NET Core》文章中,有介绍两种迁移方案:
方案一、将现有项目和 .NET Core 项目合并为单个项目(多目标框架)
方案二、将现有项目和新的 .NET Core 项目分离(拷贝到新项目)
通过类名、命名空间,查询API的实现信息
迁移过程中,有类库命名空间被调整,nuget归属包被调整,具体类库在.NET Core哪个版本中被实现也不是很清楚,通过下面两个查询助手,即可解决这些问题。
1、查询命名空间、类库在哪个nuget package包中定义(第一次查询比较慢)
结果图如下:


类库项目、应用项目如何选择框架类型
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:通过
ASP.NET Core可以在“.NET Framework 和 .NET Core”上运行,但ASP.NET Core 3.0 以及更高版本只能在 .NET Core 中运行。
具体参见:
.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
参考:
如何将条件编译符号(DefineConstants)传递给msbuild
迁移到.NET Core,但只运行在windows平台上
使用 Windows 兼容性包将代码移植到 .NET Core
如何:将 Windows 窗体桌面应用程序移植到 .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”错误
.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/8464677/why-is-jsonrequestbehavior-needed?r=SearchResults
获取ASP.NET Core中的Web根路径和内容根路径(移除的MapPath)
由于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,具体代码参考下面
var dlls = DependencyContext.Default.CompileLibraries
.SelectMany(x => x.ResolveReferencePaths())
.Distinct()
.Where(x => x.Contains(Directory.GetCurrentDirectory()))
.ToList();
foreach (var item in dlls)
{
try
{
AssemblyLoadContext.Default.LoadFromAssemblyPath(item);
}
catch (System.IO.FileLoadException loadEx)
{
} // The Assembly has already been loaded.
catch (BadImageFormatException imgEx)
{
} // If a BadImageFormatException exception is thrown, the file is not an assembly.
catch (Exception ex)
{
}
}
参考:
AppDomain.CurrentDomain.GetAssemblies()
Is there an alternative for BuildManager.GetReferencedAssemblies() in ASP.NET Core?
.NET Core 2.0迁移System.Runtime.Caching
迁移EF框架
修改为 ASP.NET Core 风格的应用
按照上面的方式修改API兼容性后,框架类库可以顺利迁移到.NET Core,编译通过,代码运行也正常。但是ASP.NET Core风格的应用,其写法也是有很多变化的。具体参考下面文档:
【微软官方】ASP.NET 迁移到 ASP.NET Core教程系列
推荐阅读:
==============================================================================
over,谢谢查阅,觉得文章对你有收获,请多帮推荐。欢迎提供更好的资料信息。
.NET项目迁移到.NET Core操作指南的更多相关文章
- (转)项目迁移_.NET项目迁移到.NET Core操作指南
原文地址:https://www.cnblogs.com/heyuquan/p/dotnet-migration-to-dotnetcore.html 这篇文章,汇集了大量优秀作者写的关于" ...
- 在Visual Studio中将现有.NET Framework项目迁移至.NET Core 1.1 Preview 1
1)下载安装包含 .NET Core 1.1 Preview 1 的 SDK:Windows x64 安装包(下载地址列表) 2)下载最新 VS 2015 NuGet 插件:https://dist. ...
- .NET 4.5+项目迁移.NET Core的问题记录
.NET 4.5+项目迁移.NET Core的问题记录 这几天试着把目前的开发框架迁移到新的.net core平台,中间遇到的问题在这里简单记录一下. 迁移过程遇到的最大的问题IOC容器.我目前使用的 ...
- 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- 58HouseSearch项目迁移到asp.net core
前言 58HouseSearch这个项目原本是基于ASP.NET MVC 4写的,开发环境是Windows+VS2015,发布平台是linux+mono+jexus,这样看来整个项目基本已经满足跨平台 ...
- 旧 WCF 项目迁移到 asp.net core + gRPC 的尝试
一个月前,公司的运行WCF的windows服务器down掉了,由于 AWS 没有通知,没有能第一时间发现问题. 所以,客户提出将WCF服务由C#改为JAVA,在Linux上面运行:一方面,AWS对Li ...
- [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 webservice/API
2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议.这仅代表我的个人意见, 我有充分的理由推荐.net 程序 ...
- asp.net core 1.1 项目升级至 asp.net core 2.0 preview 2 与正式版
这两天把一个 asp.net core 1.1 的项目迁移到了 asp.net core 2.0 preview 2 ,在这篇随笔中记录一下. 如果项目在有 global.json 文件,需要删除或修 ...
随机推荐
- SAP和去哪儿网面试感悟
这两天先后面了两家公司,个人感觉挺有意思,就写下来.现在是4月份,校招基本没有了,去哪儿网刚好有春招,我就去试试.SAP是同学推荐的. 去哪儿.参加笔试,个人感觉还行.半个月后收到面试通知.到了面试现 ...
- iOS Widget简单使用
iOS的Widget类似Android的Notification设置flags为Notification.FLAG_ONGOING_EVENT后 OK,大约知道是什么意思了,现在可以开始码了 ...
- Xpose菜鸟笔记
0.官网入门教程 https://github.com/rovo89/XposedBridge/wiki/Development-tutorial 1.Hook自定义类中的私有类 https://fo ...
- adb 命令连接指定设备
试用条件: 当有多个设备online时: 步骤: 1. 通过adb devices命令获取所有online设备的serial number C:\Users\Administrator>adb ...
- UWP显示对话框
public static async void ShowMessage(string message) { var msgDialog = new Windows.UI.Popups.Message ...
- PowerDesigner 在通过jdbc连接数据库时 Could not Initialize JavaVM!
最近用到PowerDesigner的逆向工程,从数据库中逆向生成模型,本想使用odbc连接的,但是需要安装驱动,mysql的还好弄,oracle对我来讲实在是有些麻烦,看到能用jdbc连接,就想试试, ...
- TIME WINAPI
GetDynamicTimeZoneInformation https://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs ...
- ThoughtWorks 面试备忘录
ThoughtWorks 面试备忘录 前言 前段时间 ThoughtWorks 在网上和拉勾网合作搞了一次网络招聘,名为抛弃简历!让代码说话!,可谓赚足了眼球,很多程序猿纷纷摩拳擦掌.踊跃提交代码,在 ...
- C语言实现常用排序算法——冒泡排序
原理:比较临近的两个元素,只要不符合顺序就进行交换:要点:1.不要越界:2.遍历一遍以后最大的元素就会到最后,所以下次遍历就不用遍历整个数组 void bubble_sort(int a[],int ...
- java多线程之管道流
java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据. 一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道 ...