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

14

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

我只询问关于 VS 项目迁移的问题,而不涉及任何潜在的不兼容性问题。


4
在今天的.NET Conf视频中(请参见当前正在运行的https://www.dotnetconf.net/的直播,倒回到视频的1:27-1:28(1小时+27-28分钟)处观看),有一个名为“try-convert”的新工具可以尝试为您进行转换。如何安装此工具,从哪里获取,我不知道,如果您已安装了Visual Studio 2019和.NET Core 3 SDK,则可能很明显,这就是为什么我将其留作评论而不是答案的原因。 - Lasse V. Karlsen
请参考以下链接:https://learn.microsoft.com/zh-cn/dotnet/core/porting/winforms。需要注意的是,WinForm设计器目前还不支持.NET Core,因此您可能还需要查看最新的VS 2019预览版。 - Ed Dore
Olia Gavrysh(做演示的女士)说他们将在7小时后发布它 :) 一旦链接可用,我会立即粘贴。 - watbywbarif
1
测试Winform迁移.Net Core 3.0可能会很有趣,以备将来升级使用,但我不建议在已经需要在生产环境上平稳运行的大型应用程序中使用。即使是为了测试目的,如果您不急于使用,请至少等待几周所需工具的官方可用性,这样会更容易。 - AFract
@LasseVågsætherKarlsen 我使用带有.NET Core 3的Visual Studio 2019,但磁盘上没有这样的文件。我认为他们甚至说过,由于该工具不是100%成功,因此它将不会成为官方VS安装的一部分。 - watbywbarif
显示剩余2条评论
4个回答

11

6
try-convert 不是官方工具。他们写道:“这个工具不受任何支持”,“这是一个由 .NET 团队成员在业余时间构建的开源项目”。 - Ted
从net20升级到net47的命令是什么? - Karthic G
在应用命令“try-convert -w app.csproj”时,出现错误:“app.csproj包含对System.Web的引用,在.NET Core上不受支持。您可能需要大量工作来完全移植此项目。”我们该怎么办?是否有可能强制迁移? - Karthic G

1

微软发布了一个新的升级助手工具,可以将你的.NET Framework项目迁移到.NET 5。迁移后,你可以在csproj文件中更改TargetFramework为任何版本的.NET。

我运行了以下命令来安装这个工具:

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

然后使用它:
upgrade-assistant .\MyProject.csproj

1

请按照以下步骤操作:

使用可移植性分析器

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

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

2.在“应用程序路径”文本框中输入您的Windows Forms或WPF应用程序的目录路径(可以插入路径字符串或单击“浏览”按钮并导航到文件夹)。

3.单击“分析”按钮。

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

使用.NET可移植性分析器确定应用程序所依赖的是否缺少.NET Core的API。如果确实缺少,则需要重构代码以避免对.NET Core不支持的API的依赖。有时可以找到提供所需功能的替代API。

迁移

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

2. 迁移到SDK-style .csproj文件。要将我的应用程序移植到.NET Core,首先需要将项目文件更改为SDK-style格式,因为旧格式不支持.NET Core。此外,SDK-style格式更加简洁,易于使用。确保你有当前.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.将.NET Framework迁移到.NET Standard或.NET Core。为此,请替换此内容

<TargetFramework>net472</TargetFramework>

使用

<TargetFramework>netstandard2.0</TargetFramework>

或者

<TargetFramework>netcoreapp3.0</TargetFramework>

4. 在项目文件中复制所有来自旧项目的外部引用,使用旧的csproj文件找到项目引用并替换。例如:

<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>


8
换言之,从 .Net Framework 转换到 .Net Core 就像将香蕉转换为福特福克斯一样容易。 - Richard Hammond
运行良好。还将Microsoft.NET.Sdk更改为Microsoft.NET.Sdk.WindowsDesktop。 - Softlion

0
也许在某些情况下,粗暴的迁移(OP中提到的)确实是最容易的,尤其是在存在第三方库无法自动处理的情况下。 我的Winforms (.NET 4.6.2 with 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的表单编辑器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接