综述

.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. HBase协处理器加载的三种方式

    本文主要给大家罗列了HBase协处理器加载的三种方式:Shell加载(动态).Api加载(动态).配置文件加载(静态).其中静态加载方式需要重启HBase. 我们假设我们已经有一个现成的需要加载的协处 ...

  2. 钩子函数 Function类

    Function 为 com.google.common.base包下接口类: public interface Function<F, T> { @Nullable T apply(@N ...

  3. 返回指定字符串位置的函数FIELD(S,S1,S2,...) 与 FIND_IN_SET(S1,S2) 函数

    FIELD(S,S1,S2,...)  与 FIND_IN_SET(S,S1) 函数  ------> 这2个函数都是返回指定字符串在源串中的出现的位置(皆是第一次出现的位置),但2个函数的参数 ...

  4. AJ学IOS(26)UI之iOS抽屉效果小Demo

    AJ分享,必须精品 先看效果 实现过程 第一步,把三个view设置好,还有颜色 #warning 第一步 - (void)addChildView { // left UIView *leftView ...

  5. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  6. Plant 矩阵快速幂,,,,有点忘了

    题目链接:https://codeforces.com/contest/185/problem/A 题目大意就是求n次以后  方向朝上的三角形的个数 以前写过这个题,但是忘了怎么做的了,,,又退了一遍 ...

  7. Java数组 —— 八大排序

    (请观看本人博文--<详解 普通数组 -- Arrays类 与 浅克隆>) 在本人<数据结构与算法>专栏的讲解中,本人讲解了如何去实现数组的八大排序. 但是,在讲解的过程中,我 ...

  8. LABEL和UUID

    基本用法 blkid 查看LABEL # blkid -s LABEL /dev/hda3: LABEL="/" /dev/hda1: LABEL="/boot1&quo ...

  9. python信息收集(二)

        在第二层主机发现中,除了使用arping命令外,还可以使用Kali下自带的一个工具----netdiscover.      netdiscover是一个专门用于二层主机发现的工具,它有两种扫 ...

  10. Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \;

    find命令的参数: pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录.-print: find命令将匹配的文件输出到标准输出.-exec: find命令 ...