Asp-Net-Webapi项目从Framework-4-5升级到-Net-6的总结
前言
目前手头上有个项目是Framework4.5.2版本的,实在是太老了,以至于github上很多好的开源库都用不上,同时Asp.Net版本的webapi和Core版本后的webapi各方面的差异比较大,比如IOC、AOP、管道等等,个人认为用Core版本的开发更加方便、更现代化,当然也有可能是我对Core比较熟悉,而对老版本的webapi不熟,不管怎么样,从framework升级到core还是很有必要的。
整个迁移过程总共用时1周,由于部分功能需要依赖Solidworks、UG,而这些软件的dll都是framework版本的,所以没办法把所有项目都升级到core,有个控制台的模块还是需要用framework,这个模块引用的其他通用的库也必须是Framework的,因此最后整个项目其实是framework+core混合用的,项目的架构这里就不放上来了,简单列举一下目前项目的主要模块:
- Webapi:后台服务,升级了.Net 6
- Worker Service:后台服务2,升级了.Net 6
- Console App:控制台应用 从Framework4.5升级到4.8
- 其他公共库,比如Service、Repository、Model、Utility、Core等库,如果ConsoleApp会调用的,则还是使用Framework,其他一律都使用.Net 6版本
下面总结一下整个升级过程中需要注意的地方
如果项目中依赖的第三方库都可以升级到core,那么自己的项目其实也可以都升级到core,然后再重新依赖core版本的第三方库,这样就简单很多了,不用趟那些兼容问题的坑
注意事项
Framework和.Net Core和.Net Standard的对应关系
首先需要搞清楚的是.Net Framework、.Net Core、.Net Standard三者的关系,简单来说.Net Standard相当于一个Interface(标准化的接口),而Framework和Core都是对这个接口的实现。不过,Framework 4.6.1以上只支持到了.Net Standard2.0,而.Net Standard 2.1以后,就只剩下.Net Core3、3.1和后面的.Net 5、6、7了。
以上知识点在我们安装一些第三方库的时候用得上,比如我们在nuget上想安装一个库,一般这个库会指明依赖的是大于.Net Standard X版本,如果X是2.0,那说明Framework的高版本还是能装上的,如果是X是2.1,那说明只能是Core版本才能用
具体的版本对应参考:.Net Core、Framework、Standard版本对应文档
Framework和Core之间不兼容的地方
在.Net Core 2.0(也就是.Net Standard 2.0)版本之前是没办法在Core项目中引用Framework的dll的( Framework的系统库是来自mscorlib ,Core的库是来自System.Runtime),但是在.Net Core 2.0之后是可以的,不过虽然可以保证编译通过,但是如果在Framework的dll中使用了一些Core中无法使用的函数或功能,那么就会出现运行时错误,关于具体不兼容的部分,可以参考下面的链接:
当然,还有Framework中如果使用了一些特定于Windows平台的函数或库,也会出现运行时错误,这时候就需要安装一些兼容的库:
https://www.nuget.org/packages/Microsoft.Windows.Compatibility
不过这样做之后就只能在windows上运行了
dotnet cli和msbuild的区别
dotnet cli
和msbuild
可以看做基本一样,因为dotnet cli
内部调用的是msbuild
,不过还是有一些小的区别,可以看下面这篇文章:
Relationship between the dotnet cli and the new vs2017 msbuild
nuget restore和dotnet restore的区别
nuget restore
和dotnet restore
基本上一样,都执行nuget还原操作,区别在于:
dotnet restore
调用的是dotnet msbuild /t:Restore
,这个命令只认识解决方案中的PackageReference
而packages.config
文件引用的库使用dotnet cli
和msbuild
都还原不了
package.config
是一些旧的项目才会用到的东西,现在都是用PackageReference
模式了,如果不想使用nuget cli
去还原包,也可以在项目内把package.config
转换成PackageReference
形式