介绍

由于历史原因,基于 Windows 平台存在着大量的基于 .NetFramework 开发的 WPF 和 WinForm 相关程序,如果将这些程序全部基于
DotNetCore 3.0 重写一遍显然是不现实的,但是 DotNetCore 是未来发展的趋势。所以本文通过以 WPF 为例,介绍一下如何将传统 WPF
迁移到DotNetCore 3.0 上。

环境

我在之前的一篇文章 DotNetCore 3.0 助力 WPF 开发
<https://www.cnblogs.com/hippieZhou/p/10637348.html> 有提到过,如果想开发基于 DotNetCore 3.0
的WPF 程序,我们需要安装 Visual Studio 2019 和 DotNetCore 3.0 SDK
,这两个条件是必须具备的。同样的,我们做框架迁移,这两个条件同样也是必须的。

注:为了不必要的麻烦,建议使用 Visual Studio 2019 来进行迁移工作。

实验

首先,我们通过 Visual Studio 2019 创建一个传统的基于 .NetFramework 的 WPF 程序。如下图所示:



项目创建完成之后,你会发现还是那个属性的味道,没有什么变化。尝试编译运行,也是没什么问题。

更新 NuGet

在做迁移之前,我们需要确认一下我们的项目是否引用了 NuGet
上的一些包,如果引用了,请务必更新至最新版本。虽然这不是必须的,但是却是有必要的,避免在迁移过程中出现一些未知错误。

这里,我引用一下 Newtonsoft.Json 作为示例。在 MainWindow.xaml.cs 中尝试使用
public partial class MainWindow : Window { public MainWindow() {
InitializeComponent(); } protected override void OnContentRendered(EventArgs e)
{ var user = new User { Name = "hippieZhou", Eamil = "hippiezhou@outlook.com"
}; var json = Newtonsoft.Json.JsonConvert.SerializeObject(user);
Trace.WriteLine(json); base.OnContentRendered(e); } } public class User {
public string Name { get; set; } public string Eamil { get; set; } }
编译运行程序,可以正常编译运行和执行。控制台也输出了 User 对象也能正确序列化。

使用 Portability Analyzer

.NET Portability Analyzer
<https://github-production-release-asset-2e65be.s3.amazonaws.com/143935249/438c23fe-9af2-11e8-8344-29573fa77797?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190406%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190406T040612Z&X-Amz-Expires=300&X-Amz-Signature=880d2af4fd3e2697d34e774d1d70f8f6c73286cf4a026c645a5f264d8326bd9a&X-Amz-SignedHeaders=host&actor_id=13598361&response-content-disposition=attachment%3B%20filename%3DPortabilityAnalyzer.zip&response-content-type=application%2Foctet-stream>
工具是用于检测我们当前的 WPF 程序中使用的所有 API 是否支持迁移到DotNetCore 3.0 上。运行该工具后如下图所示:



点击 Browser 按钮,将我们的项目目录加载进来,之后点击 Analyze,等分享完成之后,点击 Open Report 即可查看检测结果,如下图所示:



从上图中,我们可以看到,我们的程序当前的框架为 .NetFramework 4.7.2,当前使用的程序集 在 DotNetCore 3.0 受支持率为
100%,这就表明我们的程序可以无缝迁移到 DotNetCore 上了。

迁移 packages.config

如果我们的程序引用了 NuGet 上的包,那么 VS 会为我们创建一个 packages.config,这个文件在 DotNetCore
中不受支持,所以我们需要将它修改为受支持的类型。

鼠标右键它,然后点击 Migrate packages.config to PackageReference 即可,如下图所示:



迁移 XXX.csproj

这里,我们修改我们示例程序中的 WpfApp1.csproj,在传统的 .csproj 中会有一大堆配置,这些配置方式在 DotNetCore
中同样不适用了。因此,我们需要将我们的内容修改一下,如下所示:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF>
</PropertyGroup> <ItemGroup> <PackageReference Include="Newtonsoft.Json"
Version="12.0.1" /> </ItemGroup> </Project>
重新加载项目后,会如下图所示:



接着,我们需要删除掉项目中的 Properties,操作完毕后尝试重新编译运行,如果不出意外的话,应该是可以正常执行的。

最后,我们可以对比一下这种迁移后的项目结构和直接通过 DotNetCore 创建的项目结构之间的差别,如下图所示:



总结

需要补充的一点是,目前在 VS2019 中创建 DotNetCore 3.0 的 WPF 项目时, XAML
的设计视图还是不可用的状态,所以这个需要注意一下。

DotNetCore 是未来发展的趋势,由于目前还是预览版,所以我们可以先试着做一些技术储备,等待正式版出来后,我们就可以很快的迁移过来。

相关参考

* getting-started-net-core-3-create-wpf-application
<http://brianlagunas.com/getting-started-net-core-3-create-wpf-application/>
* how-to-port-desktop-applications-to-net-core-3-0
<https://devblogs.microsoft.com/dotnet/how-to-port-desktop-applications-to-net-core-3-0/>
* are-your-windows-forms-and-wpf-applications-ready-for-net-core-3-0
<https://blogs.msdn.microsoft.com/dotnet/2018/08/08/are-your-windows-forms-and-wpf-applications-ready-for-net-core-3-0/>
* Prerequisites for .NET Core on Windows
<https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites?tabs=netcore2x>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信