Loading

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混合用的,项目的架构这里就不放上来了,简单列举一下目前项目的主要模块:

  1. Webapi:后台服务,升级了.Net 6
  2. Worker Service:后台服务2,升级了.Net 6
  3. Console App:控制台应用 从Framework4.5升级到4.8
  4. 其他公共库,比如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中无法使用的函数或功能,那么就会出现运行时错误,关于具体不兼容的部分,可以参考下面的链接:

  1. Framework和Core的不兼容部分说明

当然,还有Framework中如果使用了一些特定于Windows平台的函数或库,也会出现运行时错误,这时候就需要安装一些兼容的库:

https://www.nuget.org/packages/Microsoft.Windows.Compatibility

不过这样做之后就只能在windows上运行了

dotnet cli和msbuild的区别

dotnet climsbuild可以看做基本一样,因为dotnet cli内部调用的是msbuild,不过还是有一些小的区别,可以看下面这篇文章:

Relationship between the dotnet cli and the new vs2017 msbuild

nuget restore和dotnet restore的区别

nuget restoredotnet restore基本上一样,都执行nuget还原操作,区别在于:

  • dotnet restore调用的是dotnet msbuild /t:Restore,这个命令只认识解决方案中的PackageReferencepackages.config文件引用的库使用dotnet climsbuild都还原不了

package.config是一些旧的项目才会用到的东西,现在都是用PackageReference模式了,如果不想使用nuget cli去还原包,也可以在项目内把package.config转换成PackageReference形式

参考链接

  1. Relationship between the dotnet cli and the new vs2017 msbuild
  2. 'dotnet restore' vs. 'nuget restore' with TeamCity
  3. What's the difference between using dotnet and MSBuild for building .NET applications?
  4. .Net Core、Framework、Standard版本对应文档
  5. Framework和Core的不兼容部分说明
posted @ 2023-01-12 09:22  李正浩  阅读(412)  评论(0编辑  收藏  举报