

迁移WPF项目到.NET CORE
source link: http://www.cnblogs.com/podolski/p/12838473.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

综述
.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文件,就会冲突。二选一解决这个问题
<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并设置总是复制到目标目录,直接读取文件。
总结
最后编译,我这边只有几个警告,没有错误了。鉴于程序可以正常运行,我这有空再优化吧。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK