.NET平台系列24:从.NET Framework迁移到.NET Core/.NET5的技术指南
本文讲解了在将代码从 .NET Framework 移植到 .NET(旧称为 .NET Core)时应考虑的事项。 对于许多项目,从 .NET Framework 移植到 .NET 是相对简单的。 项目的复杂性决定了在项目文件的初始迁移之后要做多少工作。
应用模型在 .NET 中可用的项目(如库、控制台应用和桌面应用)通常不需要太大的更改。 需要使用新应用模型的项目(如从 ASP.NET 迁移到 ASP.NET Core)需要的工作要多一点。 旧应用模型中的很多模式都有可以在转换过程中使用的等效项。
.NET Framework 中有一些技术在 .NET 中是不存在:
-
不支持创建额外应用程序域。 对于代码隔离,将流程或容器用作备用。
-
远程处理用于跨不再受支持的应用程序域进行通信。 对于跨进程通信,可将进程间通信 (IPC) 机制视为远程处理的备用方案,如 System.IO.Pipes 类或 MemoryMappedFile 类。
-
CAS 是受 .NET Framework 支持、但在 .NET Framework 4.0 中已停用的沙盒技术。 它已被 Security Transparency 取代,并且在 .NET 中不受支持。 请改用操作系统提供的安全边界,如虚拟化、容器或用户帐户。
-
与 CAS 类似,这种沙盒技术不再被推荐用于 .NET Framework 应用程序,而且在 .NET 中也不受支持。 请改用操作系统提供的安全边界,如虚拟化、容器或用户帐户。
-
.NET 不支持 System.EnterpriseServices (COM+)。
Windows Workflow Foundation (WF) 和 Windows Communication Foundation (WCF)
.NET 5 及更高版本(包括 .NET Core)不支持 WF 和 WCF。 有关替代方法,请参阅 CoreWF 和 CoreWCF。
若要详细了解这些不受支持的技术,请参阅 .NET Framework 技术在 .NET Core 和 .NET 5 及更高版本上不可用。
许多为 .NET Framework 创建的应用程序都使用桌面技术,如 Windows 窗体或 Windows Presentation Foundation (WPF)。 虽然 Windows 窗体和 WPF 均已移植到 .NET 中,但这些仍是仅适用于 Windows 的技术。
在迁移 Windows 窗体或 WPF 应用程序之前,请先考虑以下依赖项:
- 适用于 .NET 的项目文件使用与 .NET Framework 不同的格式。
- 你的项目可能会使用在 .NET 中不可用的 API。
- 第三方控件和库可能还没有移植到 .NET 中,仍只对 .NET Framework 可用。
- 你的项目使用在 .NET 中不再可用的技术。
.NET 使用 Windows 窗体和 WPF 的开放源代码版本,并对 .NET Framework 进行了增强。
有关将桌面应用程序迁移到 .NET 5 的教程,请参阅以下文章之一:
应用程序仍可以在 .NET 支持的平台上对本机库进行平台调用。 这项技术并不仅限于 Windows。 但是,如果你引用的库是特定于 Windows 的(如 user32.dll 或 kernal32.dll),那么代码只能在 Windows 上正常运行。 对于想要在其上运行应用的每个平台,你都必须查找特定于平台的版本,或者让你的代码足够通用以在所有平台上运行。
当将应用程序从 .NET Framework 移植到 .NET 时,应用程序可能使用了随 .NET Framework 一起分发的库。 许多在 .NET Framework 中可用的 API 都没有移植到 .NET 中,因为它们依赖特定于 Windows 的技术,如 Windows Registry 或 GDI+ 绘图模型。
Windows Compatibility Pack 为 .NET 提供了大部分的 .NET Framework API 面,并通过 Microsoft.Windows.Compatibility NuGet 包提供。
有关详细信息,请参阅使用 Windows Compatibility Pack 将代码移植到 .NET 中。
.NET Framework 兼容性模式是在 .NET Standard 2.0 中引入的。 使用此兼容性模式,.NET Standard 和 .NET 5 及更高版本(以及 .NET Core 3.1)项目可以在仅适用于 Windows 的情况下引用 .NET Framework 库。 引用 .NET Framework 库不适用于所有项目(如库使用 Windows Presentation Foundation (WPF) API 时),但它的开启了很多移植方案。 有关详细信息,请参阅分析依赖项以将代码从 .NET Framework 移植到 .NET 中。
.NET(旧称为 .NET Core)是为跨平台而设计的。 如果代码不依赖特定于 Windows 的技术,那么它可以在 macOS、Linux 和 Android 等其他平台上运行。 这包括如下项目类型:
- 库
- 基于控制台的工具
- 自动化
- ASP.NET 站点
.NET Framework 是仅适用于 Windows 的组件。 当代码使用特定于 Windows 的技术或 API(如 Windows 窗体和 Windows Presentation Foundation (WPF))时,代码仍可以在 .NET 上运行,但不能在其他操作系统上运行。
库或基于控制台的应用程序不需要太多更改就可以跨平台使用。 当移植到 .NET 时,可能需要考虑这一点,并在其他平台上测试应用程序。
.NET Standard是针对多个 .NET 实现推出的一套正式的 .NET API 规范。 推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。 自 .NET 5 起,采用了一种不同的方法来建立一致性;使用这种新方法,在很多情况下,都不需要使用 .NET Standard。 有关详细信息,请参阅 .NET 5 和 .NET Standard。
.NET Standard 2.0 是支持 .NET Framework 的最后一个版本。
可以使用不同的工具来帮助自动执行迁移的某些方面,而不是将应用程序从 .NET Framework 手动移植到 .NET 中。 移植复杂的项目本身就是一个复杂的过程。 这些工具可能在此过程中有所帮助。
即使你使用工具来帮助移植应用程序,也应查阅本文中的“移植时的注意事项”部分。
.NET 升级助手
.NET 升级助手是一款可以在不同类型的 .NET Framework 应用上运行的命令行工具。 它旨在帮助将 .NET Framework 应用升级到 .NET 5。 在运行此工具后,大多数情况下,应用将需要更多操作才能完成迁移。 此工具会安装可以帮助完成迁移的分析器。 此工具适用于以下类型的 .NET Framework 应用程序:
- Windows 窗体
- WPF
- ASP.NET MVC
- 控制台
- 类库
此工具使用本文中列出的其他工具,并指导迁移过程。 若要详细了解此工具,请参阅 .NET 升级助手概述。
try-convert
try-convert 工具是一款 .NET 全局工具,可用于将项目或整个解决方案转换为 .NET SDK,包括将桌面应用迁移到 .NET 5。 但是,如果你的项目有复杂的生成进程(如自定义任务、目标或导入),则不建议使用此工具。
有关详细信息,请参阅 try-convert GitHub 存储库。
.NET 可移植性分析器
.NET 可移植性分析器是一种工具,可分析程序集并为应用程序或库提供有关缺失的 .NET API 的详细报告,以便在指定的目标 .NET 平台上实现可移植性。
若要使用 Visual Studio 中的 .NET 可移植性分析器,请从市场中安装此扩展。
有关详细信息,请参阅 .NET 可移植性分析器。
平台兼容性分析器
平台兼容性分析器分析你是否在使用将会在运行时抛出 PlatformNotSupportedException 的 API。 尽管这并不常见,但如果从 .NET Framework 4.7.2 或更高版本进行移动,最好进行检查。 若要详细了解会在 .NET 上抛出异常的 API,请参阅始终在 .NET Core 上抛出异常的 API。
有关详细信息,请参阅平台兼容性分析器。
将应用程序移植到 .NET 时,请按顺序考虑以下建议。
️ 考虑使用 .NET 升级助手来迁移项目。 尽管此工具处于预览阶段,但它自动执行本文中详细介绍的大部分手动步骤,并为你继续迁移路径提供了一个很好的起点。
️ 考虑先检查依赖项。 依赖项必须定目标到 .NET 5、.NET Standard 或 .NET Core。
️ 务必从 NuGet packages.config 文件迁移到项目文件中的 PackageReference 设置。 使用 Visual Studio 转换 package.config 文件。
️ 考虑升级到最新的项目文件格式,即使你还不能移植应用,也不例外。 .NET Framework 项目使用过时的项目格式。 尽管最新的项目格式(称为“SDK 样式项目”)是为 .NET Core 及更高版本创建的,它们也适用于 .NET Framework。 拥有最新格式的项目文件可以为将来移植应用打下良好的基础。
️ 务必将 .NET Framework 项目重新定目标到 .NET Framework 4.7.2 及更高版本。 在 .NET Standard 不支持现有 API 情况下,这可确保最新备用 API 的可用性。
️ 考虑定目标到 .NET 5(而不是 .NET Core 3.1)。 虽然 .NET Core 3.1 是长期支持 (LTS) 版本,但 .NET 5 是最新的,并且 .NET 6 也将在发布后成为 LTS。
️ 务必为 Windows 窗体和 WPF 项目定目标到 .NET 5。 .NET 5 包含许多对桌面应用的改进。
️ 若要迁移也可以用于 .NET Framework 项目的库,请考虑定目标到 .NET Standard 2.0。 也可以为库设定多个目标,同时定目标到 .NET Framework 和 .NET Standard。
️ 如果迁移之后出现缺少 API 的错误,请务必添加对 Microsoft.Windows.Compatibility NuGet 包的引用。 大部分 .NET Framework API 面是通过 NuGet 包提供给 .NET 的。
参考文献:
- https://docs.microsoft.com/en-us/dotnet/core/porting/
- .NET 升级助手概述
- ASP.NET 到 ASP.NET Core 迁移
- 将 .NET Framework WPF 应用迁移到 .NET
- 将 .NET Framework Windows 窗体应用迁移到 .NET
- 将 .NET Framework 库移植到 .NET 中
- 适用于服务器应用的 .NET 5 与 .NET Framework
.NET平台系列24:从.NET Framework迁移到.NET Core/.NET5的技术指南的更多相关文章
- .NET平台系列27:在 Linux 上安装 .NET Core/.NET5/.NET6
系列目录 [已更新最新开发文章,点击查看详细] .NET 在不同的 Linux 发行版上可用. 大多数 Linux 平台和发行版每年都有一个主要版本,并提供用于安装 .NET 的包管理器. 本 ...
- .NET平台系列26:在 Windows 上安装 .NET Core/.NET5/.NET6
系列目录 [已更新最新开发文章,点击查看详细] 本文介绍如何在 Windows 上安装 .NET. .NET 由运行时和 SDK 组成. 运行时用于运行 .NET 应用,应用可能包含也可能不包 ...
- .net core 2.0学习笔记(三):度量.net framework 迁移到.net core的工作量
把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持.两个类库的差异性,通过人工很难识别全.好在微软的工程师们考虑到了我 ...
- .NET平台系列23:.NET Core/.NET5/.NET6 和 .NET Framework 的选择建议
系列目录 [已更新最新开发文章,点击查看详细] 有两种支持的 .NET 实现可用于生成服务器端应用: .NET Framework .NET Core/5+,包括 .NET Core..NET ...
- .NET项目迁移到.NET Core操作指南
为什么要从.NET迁移到.NET Core? .NET Core提供的特性 .NET Core性能提升 .NET如何迁移到.NET Core? 迁移工作量评估(API兼容性分析) 迁移方案制定 通过类 ...
- (转)项目迁移_.NET项目迁移到.NET Core操作指南
原文地址:https://www.cnblogs.com/heyuquan/p/dotnet-migration-to-dotnetcore.html 这篇文章,汇集了大量优秀作者写的关于" ...
- .NET平台系列22:.NET Core/.NET5/.NET6 对比 .NET Framework
系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<.NET平台系列2 .NET Framework 框架详解>与 <.NET平台系列7 .NET Core 体系结构 ...
- .NET6 平台系列4 .NET开源之路
系列目录 [已更新最新开发文章,点击查看详细] .NET平台是微软于2000年推出的Windows操作系统的应用软件开发框架,发展至今形成巨大的技术栈,涉及多语言(支持C#.F#.VB.NET ...
- .NET平台系列12 .NET未来之开源.NET Core
系列目录 [已更新最新开发文章,点击查看详细] 微软于2014年11月推出了.NET Core 1.0..NET Core的目标是从我们在过去12年中对.NET Framework的构建.交付 ...
随机推荐
- XCTF-i-get-id-200
i-get-id-200 题目描述 嗯..我刚建好了一个网站 解题过程 一共有三个页面 Hello World 告诉了页面是perl写的 Forms 输入name和age会返回渲染后的字符串 搜了一下 ...
- 【Docker】2. Docker的架构介绍、安装与卸载 (CentOS 7)
一.docker的基本组成 开局一张图. docker的组成: Client:客户端,可以通过它与docker服务进行交互.比如容器的构建.拉取.运行. DOCKER_HOST:就是docker服务. ...
- 2021最新Java面试题全集-20210326版
在手撕了数千道网络流传的面试题,外加十多个不眠之夜, 终于从里面精心挑选出约500道题目, 做为大家求职.跳槽前复习准备面试使用. 一:挑选题目的原则: 常考的.常被面试问到的 题目有一定的深度和难度 ...
- MySQL密码复杂度与密码过期策略介绍
前言: 年底了,你的数据库是不是该巡检了?一般巡检都会关心密码安全问题,比如密码复杂度设置,是否有定期修改等.特别是进行等保评测时,评测机构会要求具备密码安全策略.其实 MySQL 系统本身可以设置密 ...
- React中diff算法的理解
React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...
- x265 code tracing
方瑞东的博客专栏 http://blog.csdn.net/frd2009041510/article/details/51182920 cabbage2008的专栏 http://blog.csdn ...
- Morgan Stanley Books List:经典金融书籍推荐
一.经济学 1. 中华帝国的专制制度,佛朗索瓦.魁奈 2. 资本论(共3卷),马恩全集 3. 国家竞争优势,麦克尔.波特 4. Essentials of corporate analysis, by ...
- 为什么说Zoho CRM是最好的销售预测系统?
在文章的开头,我们来讲讲什么是销售预测--销售预测是指利用销售管道中的商机.已完成的配额.有望完成目标的销售团队或个人等关键信息对产品的销售数量与销售金额进行预测的手段.企业在制定销售计划时的重要任务 ...
- Linux USB ECM Gadget 驱动介绍
1 USB ECM介绍 USB ECM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Ethernet Networking Control Mo ...
- [Python] 网络
1.应用概念 应用层(Application Layer):将原始信息进行规范化描述,进而通过标准化接口与传输层对接 传输层(Transport Layer):实现信息的切分和重组,以及应用程序间的对 ...