如何在 Visual Studio 2019 年将 .NET Framework 4.7.2 项目迁移到 .NET Core 3.0

How to migrate .NET Framework 4.7.2 project to .NET Core 3.0 in Visual Studio 2019

我有一个针对 .NET Framework 4.7.2 的 Windows Forms 应用程序。由于 .NET Core 3.0 支持 Windows 表单,我想尝试一下。有什么方法可以将 VS2019 项目从 .NET Framework 转换为 .NET Core,或者唯一可能的方法是创建一个新的 .NET Core 项目并从旧项目添加文件?

我只询问 VS 项目迁移,而不是任何潜在的不兼容问题。

[编辑] 官方工具发布:try-convert

查看 releases 获取最新版本。

在官方工具发布之前,这里是 link 来自某个做出替代方案的人 Migration-von-NET-Framework-zu-NET-Core-per-PowerShell

请按照以下步骤操作:

使用可移植性分析器

使用以下说明 运行 可移植性分析器。

1.Run PortabilityAnalyzer.exe (https://github.com/Microsoft/dotnet-apiport-ui/releases/download/1.1/PortabilityAnalyzer.zip)

2.In 应用程序路径文本框输入您的 Windows 表单的目录路径或 WPF 应用程序(通过插入路径字符串或单击浏览按钮并导航 到文件夹)。

3.Click 分析按钮。

4.After 分析完成,关于您的应用程序目前可移植到 .NET 的报告 Core 3.0 将保存到您的光盘中。您可以通过单击“打开报告”在 Excel 中打开它 按钮。

NET Portability Analyzer to determine if there are any APIs your application depends on that are missing from .NET Core. If there are, you need to refactor your code to avoid dependencies on APIs, not supported in .NET Core. Sometimes it’s possible to find an alternative API that provides the needed functionality.

迁移

1.Replace packages.configPackageReference。如果您的项目使用 NuGet 包,您 需要将相同的 NuGet 包添加到新的 .NET Core 项目中。 .NET 核心项目 仅支持用于添加 NuGet 包的 PackageReference。移动 NuGet 引用 从 packages.config 到您的项目文件,在解决方案资源管理器中右键单击 packages.config -> 迁移 packages.config 到 PackageReference…..

2.迁移到 SDK 样式的 .csproj 文件。要将我的应用程序迁移到 .NET Core,首先我需要将我的项目文件更改为 SDK 样式格式,因为旧格式不支持 .NET Core。此外,SDK 样式的格式更精简且更易于使用 with.Make 请确保您拥有当前 .csproj 文件的副本。用以下内容替换 .csproj 文件的内容。

对于 WinForms 应用程序:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net472</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>

对于 WPF 应用程序

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net472</TargetFramework>
    <UseWPF>true</UseWPF>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>

3.Move 从 .NET Framework 到 .NET Standard 或 .NET Core。为此,请替换此

<TargetFramework>net472</TargetFramework>

<TargetFramework>netstandard2.0</TargetFramework>

<TargetFramework>netcoreapp3.0</TargetFramework>

4.In 项目文件从旧项目复制所有外部引用,使用旧 csproj 文件找到项目引用 relpace this。例如:

<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />

到 .csproj 文件

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>

<ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
</ItemGroup>

也许在某些情况下,残酷的强制迁移(在 OP 中提到)确实是最简单的,尤其是当存在无法由工具自动处理的第 3 方库时。

我的 Winforms(.NET 4.6.2 与 VS2019)示例:

(1)新建VS2019 .net core 3.0 WinForm项目

(2) 将旧项目中除 .csproj 和 .csproj.user 之外的所有文件复制并覆盖到新项目文件夹。

(3) VS2019以某种方式自动将所有复制的文件添加到新项目中(在这种情况下,需要手动删除旧项目中未包含的一些文件)。如果没有,请将它们添加到项目中。

(4) 根据新项目中的错误,添加缺少的引用。

(5) 部分代码需要手动修改如MySql.Data.MySqlClient -> MySqlConnector.

(6) 升级到 VS2019 16.8 以支持带有 .NET core 的表单编辑器。

Microsoft 发布了一个新的 Upgrade Assistant 工具,可以将您的 .NET Framework 项目迁移到 .NET 5。迁移后,您可以将 csproj 文件中的 TargetFramework 更改为您想要的任何版本的 .NET。

我运行安装工具的命令如下:

dotnet tool install -g try-convert
dotnet tool install -g upgrade-assistant

然后使用它:

upgrade-assistant .\MyProject.csproj