介绍

由于历史原因,基于 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 中尝试使用

Copy

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 中同样不适用了。因此,我们需要将我们的内容修改一下,如下所示:

Copy

<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

原文地址:https://www.cnblogs.com/hippieZhou/p/10661181.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

将传统 WPF 程序迁移到 DotNetCore 3.0相关推荐

  1. 使用 MSIX 打包 DotNetCore 3.0 客户端程序

    如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你. 介绍 MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打 ...

  2. DotNetCore 3.0 助力 WPF 开发

    前言 Visual Studio 2019 已经正式发布了,DotNetCore 3.0 的正式版也指日可待.在之前的版本中,作为一名基于微软生态的传统 WPF 程序员看着隔壁同学在开发 DotNet ...

  3. 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3

    将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3 原文:将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3 版权声明:本作 ...

  4. DotNetCore 3.0 助力 WPF本地化

    概览 随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能.方便越来越多的国家使用我们中国的应用程序,基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦了 ...

  5. 在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用

    问题描述 在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用: Copy # 启动默认文本编辑器打开 helloworld.txt Process ...

  6. WPF程序中的XPSDocumentViewer

    在.NET 3.0中,提供了对XPS文件格式的全新支持.在WPF程序中,有一个控件是DocumentViewer.这里对它的使用做一个简要介绍 <Window x:Class="Wpf ...

  7. 提高WPF程序性能的几条建议

    原文:提高WPF程序性能的几条建议 这篇博客将介绍一些提高WPF程序的建议(水平有限,如果建议有误,请指正.) 1. 加快WPF程序的启动速度: (1).减少需要显示的元素数量,去除不需要或者冗余的X ...

  8. mysql 程序迁移_如何从MySQL数据库程序中迁移数据库文件

    WordPress中文社区发现,很多时候我们在开发WordPress主题的时候,为了方便我们一般都会在自己的本地搭建的服务器环境中开发,比如wampserver或者phpsduty之类的,时间久了,本 ...

  9. WPF PRISM开发入门一( 初始化PRISM WPF程序)

    原文:WPF PRISM开发入门一( 初始化PRISM WPF程序) 这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在G ...

最新文章

  1. hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能
  2. node:ORM、数据模型、脚本创建模型与服务层
  3. 2012.2.18-silverlight设计器崩溃
  4. volatile和synchronized的区别与联系
  5. three.js TextBufferGeometry创建3d文字(文字乱码问题解答)
  6. BPS数据包常见问题
  7. colab挂载谷歌云盘出错
  8. php下载excel乱码,如何解决php下载excel乱码的问题
  9. CentOS在ssh远程重装系统的步骤
  10. 集线器故障诊断与排除
  11. Nmap Script脚本使用指南
  12. android进入微信加好友页面,Xposed-微信自动加好友功能实现2--自动跳转验证申请页面...
  13. 2019:自我觉醒的一年
  14. python 完整的海龟策略_海龟策略btc现货版
  15. SQLServer--TSQL编程语法
  16. 100层楼,2个鸡蛋,找出那一层鸡蛋破
  17. dp和px的区别,dp与px换算关系
  18. C语言递归解决八皇后问题
  19. 罗技无法使用计算机上的配置文件,为什么罗技G500s在电脑A上安装驱动程序并通过板载内存设置DPI和宏之后,在电脑B上使用时完全是出厂设置?...
  20. Android:读写外部存储文件

热门文章

  1. pta7-7旅游规划(dijkstra算法)
  2. Taro小程序采坑记
  3. JavaScript 开发的45个经典技巧
  4. mybatis源码学习(三):MappedStatement的解析过程
  5. 二 面向对象三大特性
  6. VNX NETAPP NAS 备份恢复
  7. MATLAB中求矩阵非零元的坐标
  8. 【百度分享】基于内核模块的测试代码编写(二)
  9. 如何判断当面的网页加载完成?
  10. 磨刀不误砍柴工—Exceptionless搭配log4net记录日志