使用 .NET 升级助手将.NET Framework应用迁移到.NET 5
从.NET Framework 迁移到.NET 5 犹如搬家,我们都知道搬家是很痛苦的,我们请求搬家公司来减轻我们的压力,.NET 升级助手 的作用就类似我们聘请的搬家公司,帮助我们处理繁重乏味的迁移工作。.NET 升级助手是一个全局命令行工具,可以指导你将.NET Framework应用程序迁移到.NET 5, 在这个迁移过程中自动执行几个步骤。.NET升级助手的代码: https://github.com/dotnet/upgrade-assistant/
如果我们的.NET Framework应用程序本身年龄够大,是一座屎山难以修复,.NET 5确是一种采用当今最先进材料构建的现代绿色住宅,.NET 升级助手 能让我们的迁移工作轻松一些,它也不是万能的,没办法帮助我们把系统搞的更好,在我们迁移的过程中还是需要进行一些手动工作的。
.NET 升级助手是一款可以在不同类型的 .NET Framework 应用上运行的命令行工具。 它旨在帮助将 .NET Framework 应用升级到 .NET 5。 在运行此工具后,大多数情况下,应用将需要更多操作才能完成迁移。 此工具会安装可以帮助完成迁移的分析器。
它执行下列任务:
- 添加有助于升级的分析器
- 确定要升级的项目以及升级顺序
- 将你的项目文件更新为 SDK 格式
- 将你的项目重新定位到 .NET 5
- 将 NuGet 包依赖项更新为与 .NET 5 兼容的版本,并删除存在于 .NET 5 中的传递依赖项
packages.config
- 进行 C# 更新以使用其 .NET 5 等效项替换 .NET Framework 模式
- 在适当的地方,添加通用模板文件
该工具目前支持下列 .NET Framework 应用类型:
- .NET Framework Windows 窗体应用
- .NET Framework WPF 应用
- .NET Framework ASP.NET MVC 应用
- .NET Framework 控制台应用
- .NET Framework 类库
我们将通过迁移运行 .NET Framework 4.7.2的版本的 ASP.NET MVC 应用eShopLegacyMVCSolution来评估 .NET 升级助手.
我们使用 我从 电子书“使用 Azure 云和 Windows 容器现代化现有 .NET 应用程序” 的 https://github.com/dotnet-architecture/eShopModernizing。 我把我的升级过程和结果放在了
准备工作
在开始使用升级助手之前,请确保您熟悉 Microsoft 的移植文档并了解迁移限制,尤其是在迁移 ASP.NET 应用程序时。此外,您首先使用.NET Portability Analyzer 工具来了解哪些依赖项支持 .NET 5。 这就像在搬家之前打电话给搬家公司了解他们是否可以搬家和不搬家以及可能需要多长时间。
在安装 .NET 升级助手之前,您必须确保安装好下列工具:
- Visual Studio 2019 16.8 或更高版本(需要 Visual Studio,因为该工具使用 MSBuild 来处理项目文件)
- .NET 5 SDK
该工具还依赖于try-convert
将项目文件转换为 SDK 格式的工具。您必须有版本0.7.212201
或更高版本才能使用升级助手。
在命令行下运行以下命令以安装 .NET 升级助手。(它是一个全局工具,因此您可以在任何地方运行该命令。)
dotnet tool install -g try-convert
如果已经安装try-convert
但需要升级到较新版本,请执行以下命令:
dotnet tool update -g try-convert
安装 .NET 升级助手
我们现在已准备好安装 .NET 升级助手。为此,请从终端执行以下命令:
dotnet tool install -g upgrade-assistant
安装 .NET 升级助手后,切换到解决方案所在的文件夹并输入以下命令来运行它。
upgrade-assistant <MySolution.sln>
使用升级助手迁移到 .NET 5
首先,我将从我的终端运行以下命令。(默认命令就可以工作,但是,如果需要,您可以传递其他参数,例如--verbose
.)
upgrade-assistant upgrade eShopDotNet5MVC.sln
该工具执行并向我们显示它将执行的步骤。对于流程中的每个步骤,我们可以应用流程中的下一步、跳过它、查看详细信息或配置日志记录。大多数情况下,您需要选择Apply next step
。为了节省一些时间,您可以按回车来执行此操作。
当该工具启动时,它会在项目的根目录中放置一个日志文件log.txt
第一步是备份项目。.NET 升级助手会询问您是要为备份使用自定义路径还是默认位置。完成后,我们就可以转换项目文件了。
第二步是将项目文件转换为 SDK 样式,.NET 5 项目使用的是 SDK 格式。在此步骤中,升级助手使用该ry-convert
工具将你的项目文件转换为该 SDK 格式。在此过程中,我们看到该工具警告我们一些导入,如System.Web
迁移后可能需要手动干预。
第三步是清理Nuget包的引用关系
第四步是更新TFM,.NET 升级助手会将目标框架名称 (TFM) 更新为 .NET 5.0。在我的情况下,值从net472更改为net5.0。
第五步是更新 NuGet 包,升级助手更新 TFM 后,它会尝试更新项目的 NuGet 包。该工具使用分析器来检测要删除的引用以及要使用.NET 5版本升级的软件包。然后,该工具更新包。
第六步是添加模板文件,该工具更新任何 NuGet 包后,它会添加任何相关模板文件。ASP.NET Core 使用模板文件进行配置和启动。这通常包括Program.cs
,Startup.cs
,appsettings.json
和appsettings.development.json
。
第七步是迁移应用程序配置文件,现在升级助手已准备好迁移我们的应用程序配置文件。该工具确定支持哪些设置,然后将任何可配置的设置迁移到我的appSettings.json
文件中。完成后,该工具system.web.webPages.razor/pages/namespaces
通过_ViewImports.cshtml
使用对 的@addTagHelper
引用进行更新来迁移Microsoft.AspNetCore.Mvc.TagHelpers
。
第八步是更新Razor 文件,修复Razor 文件里面的代码
第九步是更新 C# 源代码,.NET升级助手将C#代码引用升级到其.NET Core 版本。您会在终端中看到列出的几个步骤 - 并非所有步骤都适用。在这些情况下,它们将被跳过并标记为[Complete]
.
就这个例子来说,该步骤首先删除任何using
引用 .NET Framework 命名空间的语句,例如System.Web
. 然后,它确保我的ActionResult
调用来自Microsoft.AspNetCore.Mvc
命名空间。最后,升级助手确保我不使用ASP.NET Core 不支持的HttpContext.Current
。
最后一步是评估下一个项目。由于我们的解决方案只有一个项目,因此该工具退出。
现在工具已经帮我们完成大部分的迁移工作了,最后一步就是要我们手动修复剩余的问题了。仍然需要整理一些东西。大多数这些问题涉及 ASP.NET Core 如何处理启动、配置和捆绑。
在ASP.NET Core不再需要
Global.asax
和Global.asax.cs文件,
ASP.NET Core的Startup.cs
依赖注入模式替换了全球应用程序事件模型
。- 您不需要的
App_Start
文件夹或其中的任何文件(BundleConfig.cs
,FilterConfig.cs
和RouteConfig.cs
),继续把它删除了。 - 执行此操作后,您剩下的大部分错误都与静态资源的捆绑有关。ASP.NET Core 可与多种捆绑解决方案配合使用。阅读捆绑文档并选择最适合您的项目的方法。
- 最后,解决任何仍然存在的问题。这个示例的变化很小。例如,在我的
_Layout.cshtml
文件中,我们必须注入一个IHttpContextAccessor
来访问HttpContext.Session
并且我还需要清理一些ActionResult
响应。
虽然升级助手可以满足您的大部分用例,但它有一个可选的辅助功能模型,允许您自定义升级步骤,而无需自己修改工具。例如,您可以将NuGet软件包显式映射到其替换版本,添加自定义模板文件并添加自定义升级步骤。
首先,您将包含一个ExtensionManifest.json
文件,该文件定义工具在何处找到不同的扩展项。您需要一个清单,但以下所有元素都是可选的,因此您可以仅定义您需要的内容。
使用 .NET 升级助手将.NET Framework应用迁移到.NET 5的更多相关文章
- C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6
概述 .NET6 正式版本已经发布有一阵子了,今天我就体验一下如何将.NET Framework的项目升级为.NET 6. 升级条件: Windows 操作系统 .NET 6 SDK Visual ...
- PostgreSQL Entity Framework 自动迁移
1.依次添加NuGet包 EntityFramework.Npgsql.EntityFramework6.Npgsql,会自动生成一些配置文件,不过缺少数据库驱动的配置节点: <system.d ...
- Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended
问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.Extended对Mysql的支持不是很完 ...
- entity framework自动迁移
第一步,建立测试项目,普通的WinForm类型,EntityMigration: 第二步,从NuGet为项目添加MySql.Data.Entity,由Oracle提供,我选择人气高的: 第三步,建立实 ...
- Entity Framework数据库迁移
1.启用数据迁移: enable-Migrations2.增加一条数据库迁移指令:add-Migrations 必须带上一个版本名称,比如AddUsernamePassword完整的指令:add-Mi ...
- Entity Framework Core 迁移命令
Add-Migration init Update-Database init 修改model后,执行迁移的命令 更新数据库 每次更新都要{update}修改 Add-Migration {updat ...
- 在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. ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- .net core 2.0学习笔记(三):度量.net framework 迁移到.net core的工作量
把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持.两个类库的差异性,通过人工很难识别全.好在微软的工程师们考虑到了我 ...
随机推荐
- 当前Activity的onPause执行完后,调用Paused接口
目录 前言 详细流程分析 activityPaused:1843, ActivityTaskManagerService activityPaused:4930, ActivityRecord com ...
- Python中的多进程、多线程和协程
本文中的内容来自我的笔记.撰写过程中参考了胡俊峰老师<Python程序设计与数据科学导论>课程的内容. 并发处理:多进程和多线程 前置 概念: 并发:一段时间内同时推进多个任务,但不一定要 ...
- Go 包管理与依赖查找顺序
目录 1. 规则: 2. 编译时的依赖包查找机制 3.vendor vendor的层级搜索 4. modules 1. 规则: 同一目录下只能存在一个包 目录和目录下源文件的包命名可以不同 当包名与目 ...
- 今日浅谈循环 for与while
昨天写的条件分支结构与今日写的循环是编程两个最基本的也非常重要的个结构 for循环 for循环可以从一个元组(tuple),列表(list),字典(dict),集合(set),字符串(string') ...
- 805. Split Array With Same Average
In a given integer array A, we must move every element of A to either list B or list C. (B and C ini ...
- 1.7.6- 浏览器审查HTML标签元素
或者F12
- Docker怎么实现容器之间的通信?
//TODO 参考资料: https://developer.aliyun.com/article/55912 https://blog.csdn.net/u011541946/article/det ...
- 【JDK8】JDK 8 中Stream流中的去重的方法
JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...
- hdu1261 JAVA
题意: 一个A和两个B一共可以组成三种字符串:"ABB","BAB","BBA".给定若干字母和它们相应的个数,计算一共可以组成多少个不同的 ...
- hdu4907 水dp 或者set
题意: 给你一些被占用的时间点,然后有一些询问,每次输出大于等于询问时间的没被占用的最小的那个时间. 思路: 直接把所有用过的时间标记上,然后倒着更新一遍当前最小空余时间,或者 ...