迁移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分析依赖项。
- 升级nuget以
- 将项目文件迁移到新的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并设置总是复制到目标目录,直接读取文件。
总结
最后编译,我这边只有几个警告,没有错误了。鉴于程序可以正常运行,我这有空再优化吧。
推荐阅读
-
asp.net core项目mvc权限控制:分配权限
-
.Net Core 项目发布到Linux - CentOS 7(一)
-
.Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程
-
NET Framework项目移植到NET Core上遇到的一系列坑(2)
-
详解ASP.NET Core 网站发布到Linux服务器
-
在.NET Core 3.0中的WPF中使用IOC图文教程
-
在 ASP.NET Core 项目中使用 npm 管理你的前端组件包
-
Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD
-
asp.net core 从单机到集群
-
ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试