综述

.NET CORE 3.0开始,桌面端支持WPF了。很多.NET FRAMEWORK的项目已经跑了一阵子了,不是很有必要支持.NET CORE,不过最近用一个程序,为了贯彻一些C# 8的特性,需要升级项目到.NET CORE 3.1。

方法

参考官方指导,需要这么几步:

  1. 了解并更新 NuGet 依赖项:

    • 升级NuGet以使用格式。
    • 查看.NET Core或.NET Standard的顶级NuGet依赖项兼容性。
    • 将NuGet包升级到较新版本。
    • 使用.NET Portability Analyzer分析依赖项。
  2. 将项目文件迁移到新的SDK样式格式:
    • 选择是同时生成.NET Core和 .NET Framework,还是仅支持.NET Core。
    • 将相关的项目文件属性和项复制到新项目。
  3. 修复生成问题:
    • 添加对Microsoft.Windows.Compatibility兼容性包的引用。
    • 查找并修复API-level差异。
    • 删除app.config中appSettings和connectionStrings以外的部分。
    • 如有必要,重新生成自动生成的代码。
  4. 运行时测试:
    • 确认移植的应用按预期工作。
    • 注意NotSupportedException异常。

升级nuget引用

原来的nuget使用packages.config进行管理,.netcore已经全面使用<PackageReference>的形式,因此需要升级。

升级会弹出一个对话框提示,全部勾选上,直接升级。最后弹出一个升级报告。

.NET Framework移植分析

VS扩展市场查找并运行.NET Portability Analyzer以分析项目。

报告如果分析结果是



这个样子的,那就没问题。特别关注一下.NET CORE,如果不支持,需要想想别的办法:

  1. 替换这个引用/方法
  2. 升级对应的包

升级项目文件

最关键的一步来了,需要升级项目文件以便于支持.NET CORE。其实步骤很简单,用vs生成一个基于.NET CORE的WPF项目,然后,直接将csproj文件拷贝到原来的项目文件夹,使用VS添加现有项目,选择这个文件,可以发现原来的东西都自动添加进来了。

不过有的项不会自动处理,我们还需要手动对照一下原来的csproj文件和新的项目csproj文件。看看是不是缺失了一些什么内容。

PackageReference不会自动处理,引用的其他项目也不会,我们需要手动粘贴进来。

Resource也不会自动添加,可以使用通配符语法<Resource Include="Images\*.png" />

程序的图标需要重新添加。

编译之后出现这个错误。



.NET CORE程序会自动根据项目属性生成这个信息,如果还有AssemblyInfo.cs文件,就会冲突。二选一解决这个问题

  • 删除assemblyinfo.cs,不过原来的csproj文件将不可用。
  • 在新项目文件中添加<GenerateAssemblyInfo>false</GenerateAssemblyInfo>,禁用自动生成的功能。

修复生成问题

有的项目处理完毕之后还有生成错误,可以考虑引用Microsoft.Windows.Compatibility来解决一些兼容性的问题。

我的项目出现了很多警告,提示项目package不兼容。



如果包持续有人维护的话,一般情况重新安装一下对应的包解决这些问题。

update-package -reinstall

还不行的话,那么有概率你的程序不能正常运行。不想冒险,就需要找找替代了。

比如我手头上的程序,引用了CookComputing.XmlRpcV2这个包,不支持.NET CORE,但是在网上搜索一下,可以发现Kveer.XmlRPC是一个移植,直接换就好了。

继续运行,发现一直提示资源文件错误,WPF的Properties.Resources不好用了...有几种办法可以解决。

  1. 删除resx文件,将生成属性设置为resource并使用Uri参考
  2. 删除resx文件,将生成属性设置为Embedded Resource并使用集成资源参考
  3. 删除resx文件,将生成属性设置为Content并设置总是复制到目标目录,直接读取文件。

总结

最后编译,我这边只有几个警告,没有错误了。鉴于程序可以正常运行,我这有空再优化吧。

迁移WPF项目到.NET CORE的更多相关文章

  1. 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目

    迁移Net项目为Net Core\Standard项目 背景: 我们公司内部有自己ORM开发框架,最新因为需要将系统迁移到国产服务器上,所以首先需要将最基础的ORM框架改造可以运行在国产服务器上.对于 ...

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

    在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...

  3. 如何创建一个基于 .NET Core 3 的 WPF 项目

    在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...

  4. 使用 DotNet CLI 创建自定义的 WPF 项目模板

    描述 当我们安装完 DotNetCore 3.0 版本的 SDK 后,我们就可以创建基于 DotNetCore 的 WPF 项目模板,通过如下 CLI 可以方便快捷的创建并运行我们的项目: dotne ...

  5. 《Dotnet9》系列-开源C# WPF项目强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  6. 《Dotnet9》系列-开源C# WPF项目1《Accelerider.Windows》强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  7. WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?

    目录 .NET Conf 2019 Window Forms 设计器 .NET Conf 2019 2019 9.23-9.25召开了 .NET Conf 2019 大会,大会宣布了 .Net Cor ...

  8. 用Visual C++创建WPF项目的三种主要方法

    用Visual C++创建WPF项目的三种主要方法 The problem with using XAML from C++ Because C++ doesn't support partial c ...

  9. WPF外包公司——北京动点飞扬软件:开发企业WPF项目需要掌握些什么

    做为企业开发一个WPF项目,对于很多不熟悉微软WPF技术和XAML语言开发团队而言,北京动点飞扬在此给各位一点建议: 1.首先开发团队要整体对于XAML和WPF的运作机制熟悉. 2.开发人员起码要会用 ...

随机推荐

  1. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihan ...

  2. k8s Service学习

    service的概念 kubernetes service定义了一个抽象概念,一个pod的逻辑分组,一种可以访问的策略---通常称为服务.这组pod能够被service访问到,通常通过label se ...

  3. Centos7_Root密码重置

    原因: 最近出去见女朋友,竟然忘了Root用户的密码,此时考验linux基础扎不扎实的时候到了... 操作步骤: 解释补充: mount -o remountr,w / #修改根目录文件系统的权限,实 ...

  4. 【python实现卷积神经网络】padding2D层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  5. Golang Web入门(2):如何实现一个高性能的路由

    摘要 在上一篇文章中,我们聊了聊在Golang中怎么实现一个Http服务器.但是在最后我们可以发现,固然DefaultServeMux可以做路由分发的功能,但是他的功能同样是不完善的. 由Defaul ...

  6. 实现一个简单的基于动态代理的 AOP

    实现一个简单的基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的, ...

  7. [转]sql二次注入

    01 二次注入原理 二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入.防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据 ...

  8. 记录在腾讯云上搭建Ubuntu服务器

    为了能让更多的比赛题复现,只好自己去手动搭建服务器 各种奇葩的操作以及很多的由于升级之后出现的问题变成了一个个坑. 写下这篇博客以此来记录我踩过的坑. 第一步 购买一个服务器,当然我购买的是学生版本的 ...

  9. shiro:加密及密码比对器(三)

    基于[自定义remle(二)]项目增加加密功能 1:数据库t_user表增加一列(盐) 增加字段:salt CREATE TABLE `t_user` ( `id` int(11) NOT NULL ...

  10. Springboot:修改默认端口以及Logo(三)

    端口修改 在application.yml文件中增加端口的配置: server: port: 8081 Logo修改 Logo生成网址: https://www.bootschool.net/asci ...