迁移 WinForm 应用从 dotnet framework 到 dotnetcore3.0
Intro
微软从 dotnetcore3.0 开始已经开始支持 wpf 以及 winform 的开发,dotnet core 3.0 preview7 已经发布,官方称已经可以准备上生产了 Production Ready
迁移
这篇WPF的迁移还是比较不错的,如果第一次迁移,强烈推荐看一下 https://www.cnblogs.com/hippieZhou/p/10661181.html
迁移的过程还算比较顺利,因为我的依赖都是 netstandard2.0 和 net462,项目格式也都是用的新的项目格式,项目格式和包引用方式都无需修改。
主要变更:
原来 winform 项目的依赖大都是
<TargetFrameworks>net462;netstandard2.0</TargetFrameworks>
现在直接去除 net462,只保留 netstanard2.0 ,变更为<TargetFramework>netstandard2.0</TargetFramework>
Winform 项目,项目文件修改,修改 TargetFramework 为
netcoreapp3.0
并且设置<UseWindowsForms>true</UseWindowsForms>
,如果是 WPF 项目需要设置<UseWPF>true</UseWPF>
在 netframework 下,我自己封装的一个基础类库 WeihanLi.Common 中有一个 ConfigurationHelper 的帮助类,可以帮助更方便的获取和更新配置,最初也是支持 netstandard2.0 的,但是后面为了减少依赖就去掉了去 netstandard2.0 的支持,这里我直接把这个文件添加到 winform 的项目中,可以直接使用 完整的 ConfigurationHelper 代码:
单元测试的修改:
单元测试原来是 net462,改成了netcoreapp2.1,原来配置文件用的 app.config, 迁移到 dotnetcore 下面使用 appsettings.json 来代替了。
单元测试依赖注入原来使用的 AutoFac,现在改成微软的依赖注入框架了。
完整的迁移过程可以参考这个 commit https://github.com/WeihanLi/DbTool/commit/8ea3fa8a01f951af565162c290d5af7d16511fdb
发布
微软从 netcore3.0 preview 5 支持开始发布成单文件,可以使用下面的命令来发布成单文件
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
发布完看一下文件大小,172M。。。我的天啊,感觉好大,虽然说集成了运行所需要的所有环境,但还是觉得有些大,在网上找一些解决办法,发现从 dotnetcore3.0 preview6 开始支持一个 PublishTrimmed 的参数可以减小发布出来文件的大小,下面我们来试一下
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true
再看一下发布的文件的大小,109M:
虽然还是很大,可以看到相比没有 trim 还是小了很多。
使用 PublishTrimmed 来压缩文件大小的时候会使用 ilinker 来减小文件的大小,详细参考 https://github.com/dotnet/core/blob/master/samples/linker-instructions.md,需要注意的是,发布之后最好测试一下,因为有时候可能会有问题,参考这篇文章 https://dotnetcoretutorials.com/2019/06/27/the-publishtrimmed-flag-with-il-linker/, 这篇文章给出了一个使用反射 trim 发布之后不能正常工作的示例
Reference
https://devblogs.microsoft.com/dotnet/are-your-windows-forms-and-wpf-applications-ready-for-net-core-3-0/
https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0-preview-7/
https://dotnetcoretutorials.com/2019/06/20/publishing-a-single-exe-file-in-net-core-3-0/
https://dotnetcoretutorials.com/2019/06/27/the-publishtrimmed-flag-with-il-linker/
https://www.cnblogs.com/hippieZhou/p/10661181.html
https://github.com/dotnet/winforms
https://github.com/dotnet/wpf