将传统 WPF 程序迁移到 DotNetCore 3.0
介绍
由于历史原因,基于 windows 平台存在着大量的基于 .netframework 开发的 wpf 和 winform 相关程序,如果将这些程序全部基于 dotnetcore 3.0 重写一遍显然是不现实的,但是 dotnetcore 是未来发展的趋势。所以本文通过以 wpf 为例,介绍一下如何将传统 wpf 迁移到 dotnetcore 3.0 上。
环境
我在之前的一篇文章 dotnetcore 3.0 助力 wpf 开发 有提到过,如果想开发基于 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 工具是用于检测我们当前的 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 是未来发展的趋势,由于目前还是预览版,所以我们可以先试着做一些技术储备,等待正式版出来后,我们就可以很快的迁移过来。