将传统 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 是未来发展的趋势,由于目前还是预览版,所以我们可以先试着做一些技术储备,等待正式版出来后,我们就可以很快的迁移过来。
相关参考
- getting-started-net-core-3-create-wpf-application
- how-to-port-desktop-applications-to-net-core-3-0
- are-your-windows-forms-and-wpf-applications-ready-for-net-core-3-0
- Prerequisites for .NET Core on Windows
将传统 WPF 程序迁移到 DotNetCore 3.0的更多相关文章
- 使用 MSIX 打包 DotNetCore 3.0 客户端程序
如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你. 介绍 MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打 ...
- DotNetCore 3.0 助力 WPF 开发
DotNetCore Is AnyWhere. 前言 Visual Studio 2019 已经正式发布了,DotNetCore 3.0 的正式版也指日可待.在之前的版本中,作为一名基于微软生态的传统 ...
- MSIX 打包 DotNetCore 3.0
使用 MSIX 打包 DotNetCore 3.0 客户端程序 如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你. 介绍# MSIX ...
- 在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用
问题描述 在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用: # 启动默认文本编辑器打开 helloworld.txt Process.Star ...
- 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- 将Spring Boot应用程序迁移到Java9:兼容性
将 Spring Boot 应用程序迁移到 Java 9:兼容性 随着 Java 9 的到来,关于如何迁移应用程序以使用模块系统有很多的讨论.遗憾的是,大多数文章的焦点都集中于简单的 Hello Wo ...
- DotNetCore 3.0 助力 WPF本地化
概览 随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能.方便越来越多的国家使用我们中国的应用程序, 基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦 ...
- 如何利用mono把.net windows service程序迁移到linux上
How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...
- 在WPF程序中打开网页:使用代理服务器并可进行JS交互
本项目环境:使用VS2010(C#)编写的WPF程序,通过CefSharp在程序的窗体中打开网页.需要能够实现网页后台JS代码中调用的方法,从网页接收数据,并能返回数据给网页.运行程序的电脑不允许上网 ...
随机推荐
- JS的 try catch使用心得
try{ //正常执行 }catch(e/*你感觉会出错的 错误类型*/){ // 可能出现的意外 eg:用户自己操作失误 或者 函数少条件 不影响下面的函数执行 // 有时也会用在 比如 focus ...
- 彻底理解浏览器的缓存机制(http缓存机制)
一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...
- Java代码规范与质量检测插件SonarLint
1. SonarLint SonarLint是一个代码质量检测插件,可以帮助我们检测出代码中的坏味道 下载与安装 在需要检测的单个文件或者单个项目上右键 --> Analyze --> ...
- java游戏开发杂谈 - 线程
线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...
- C#爬虫使用代理刷csdn文章浏览量
昨天写了一篇关于“c#批量抓取免费代理并验证有效性”的文章,接着昨天的目标继续完成吧,最终实现的目的就是刷新csdn文章的浏览量(实际上很简单,之前博客园的文章也是可以使用代理ip来刷的,后来不行了) ...
- .NET Core中使用AutoMapper
何为AutoMapper AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 安装AutoMapper 这里我们在NuGet中下载安装Au ...
- Visual Studio 2019 发布活动 - 2019 年 4 月 2 日
Visual Studio 2019 发布活动 2019 年 4 月 2 日,星期二 | 上午 9:00 (PT) 围观: https://visualstudio.microsoft.com/zh- ...
- 小程序顶部navbar(非Slider)
wxml(该导航栏的实现原理是当你要显示哪个view在最前端的时候隐藏其他的view): <!-- 顶部navbar导航栏 --> <view class="navbar& ...
- Css3 笔记 动画 和定位属性
transform 变形属性属性:translate 平移,rotate 旋转, scale 缩放,skew 倾斜 ◆ translate :指定对象的2D平移第一个参数对应X轴,第二参数对应Y轴:如 ...
- 2017-12-09 JavaScript实现ZLOGO子集: 测试用例
续前文JavaScript实现ZLOGO子集: 前进+转向. 在添加新功能之前, 先添加测试用例, 以应对日益复杂的代码. 选择使用QUnit编写运行测试用例. 暂时对比较复杂和I/O无关的部分进行测 ...