迁移WPF项目到.NET CORE
综述
.NET CORE 3.0开始,桌面端支持WPF了。很多.NET FRAMEWORK的项目已经跑了一阵子了,不是很有必要支持.NET CORE,不过最近用一个程序,为了贯彻一些C# 8的特性,需要升级项目到.NET CORE 3.1。
方法
参考官方指导,需要这么几步:
- 了解并更新 NuGet 依赖项:
- 升级NuGet以使用格式。
- 查看.NET Core或.NET Standard的顶级NuGet依赖项兼容性。
- 将NuGet包升级到较新版本。
- 使用.NET Portability Analyzer分析依赖项。
- 将项目文件迁移到新的SDK样式格式:
- 选择是同时生成.NET Core和 .NET Framework,还是仅支持.NET Core。
- 将相关的项目文件属性和项复制到新项目。
- 修复生成问题:
- 添加对Microsoft.Windows.Compatibility兼容性包的引用。
- 查找并修复API-level差异。
- 删除app.config中appSettings和connectionStrings以外的部分。
- 如有必要,重新生成自动生成的代码。
- 运行时测试:
- 确认移植的应用按预期工作。
- 注意NotSupportedException异常。
升级nuget引用
原来的nuget使用packages.config进行管理,.netcore已经全面使用<PackageReference>的形式,因此需要升级。

升级会弹出一个对话框提示,全部勾选上,直接升级。最后弹出一个升级报告。
.NET Framework移植分析
VS扩展市场查找并运行.NET Portability Analyzer以分析项目。

报告如果分析结果是

这个样子的,那就没问题。特别关注一下.NET CORE,如果不支持,需要想想别的办法:
- 替换这个引用/方法
- 升级对应的包
升级项目文件
最关键的一步来了,需要升级项目文件以便于支持.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不好用了...有几种办法可以解决。
- 删除resx文件,将生成属性设置为resource并使用Uri参考
- 删除resx文件,将生成属性设置为Embedded Resource并使用集成资源参考
- 删除resx文件,将生成属性设置为Content并设置总是复制到目标目录,直接读取文件。
总结
最后编译,我这边只有几个警告,没有错误了。鉴于程序可以正常运行,我这有空再优化吧。
迁移WPF项目到.NET CORE的更多相关文章
- 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目
迁移Net项目为Net Core\Standard项目 背景: 我们公司内部有自己ORM开发框架,最新因为需要将系统迁移到国产服务器上,所以首先需要将最基础的ORM框架改造可以运行在国产服务器上.对于 ...
- 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- 如何创建一个基于 .NET Core 3 的 WPF 项目
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- 使用 DotNet CLI 创建自定义的 WPF 项目模板
描述 当我们安装完 DotNetCore 3.0 版本的 SDK 后,我们就可以创建基于 DotNetCore 的 WPF 项目模板,通过如下 CLI 可以方便快捷的创建并运行我们的项目: dotne ...
- 《Dotnet9》系列-开源C# WPF项目强力推荐
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- 《Dotnet9》系列-开源C# WPF项目1《Accelerider.Windows》强力推荐
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?
目录 .NET Conf 2019 Window Forms 设计器 .NET Conf 2019 2019 9.23-9.25召开了 .NET Conf 2019 大会,大会宣布了 .Net Cor ...
- 用Visual C++创建WPF项目的三种主要方法
用Visual C++创建WPF项目的三种主要方法 The problem with using XAML from C++ Because C++ doesn't support partial c ...
- WPF外包公司——北京动点飞扬软件:开发企业WPF项目需要掌握些什么
做为企业开发一个WPF项目,对于很多不熟悉微软WPF技术和XAML语言开发团队而言,北京动点飞扬在此给各位一点建议: 1.首先开发团队要整体对于XAML和WPF的运作机制熟悉. 2.开发人员起码要会用 ...
随机推荐
- python3(三十七) filepath
""" file path """ __author__on__ = 'shaozhiqi 2019/9/23' # !/usr/bin/e ...
- 同步工具类—— CountDownLatch
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CountDownLatch简介 CountDownLa ...
- AJ学IOS 之小知识iOS启动动画_Launch Screen的运用
AJ 分享,必须精品 看下效果吧 例如新浪微博的软件开启时候 就是这个 用Launch image实现 这个不难,就是在Images.xcassets 增加一个LaunchImage文件(右键 new ...
- (转) POJO和javabean的异同
参考:http://blog.csdn.net/lushuaiyin/article/details/7436318 一:什么是POJOPOJO的名称有多种,pure old java object ...
- 经常出现在python中的错误和异常处理
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://t.cn/A6Zvjdun 使用try except处理异常 上面的代码中,被除数是0,会引发ZeroDivisio ...
- search(6)- elastic4s-CRUD
如果我们把ES作为某种数据库来使用的话,必须熟练掌握ES的CRUD操作.在这之前先更正一下上篇中关于检查索引是否存在的方法:elastic4s的具体调用如下: //删除索引 val rspExists ...
- redis 分布式锁的 5个坑,真是又大又深
引言 最近项目上线的频率颇高,连着几天加班熬夜,身体有点吃不消精神也有些萎靡,无奈业务方催的紧,工期就在眼前只能硬着头皮上了.脑子浑浑噩噩的时候,写的就不能叫代码,可以直接叫做Bug.我就熬夜写了一个 ...
- [PHP] 文件创建、写入、读取
创建$p = fopen('text.txt','a+b'); 写入第一种方式//var_export方式存储数组到文件中 //这中方式存浮点型数据,存储后会多很多数字!只适合简单的存储吧!我感觉! ...
- [Yii2] 快速套模板,加载JS,CSS(HTML标签<base>)
刚开始学,弄了好久,不知道怎么加载JS.CSS,以及怎么不加载YII2自带的模板!其实真的好简单! 补: 其实是我垃圾,YII2默认访问路径是WEB,所以把style文件放到web下就能加载! 首先把 ...
- 资料整理:python接口类
1开发原则(七大原则) 一:开放封闭原则 二:接口隔离原则(将不同接口对象一一展现出来,分别调用各自的接口,完成各自的功能) 三:依赖倒置原则 高级模块不能依赖低级模块,可以依赖抽象 规范的定义: 高 ...