前言
先说结论
目前还不建议桌面端应用做迁移。
原因如下
迁移起来并不容易。
系统默认没有运行时,用户运行的时候需要安装庞大的运行时,程序自带的检测运行时的功能也不完善。
在制作Innosetup制作安装包的时候检测安装.Net6的运行时也是个问题。
所以还是退回.Net Framework了。
先决条件
- Windows 操作系统
- .NET 6 SDK
- Visual Studio 2022 17.0 或更高版本
.NET 升级助手是一个 .NET 工具,可以使用以下命令进行全局安装:
1 | dotnet tool install -g upgrade-assistant |
运行
1 | upgrade-assistant upgrade .\SchoolClient.sln |
目前结论
老项目依赖众多,很多依赖并不支持.net6,因此放弃迁移。
新项目可以考虑使用。
问题处理
打印不显示
打印要替换为
1 | System.Diagnostics.Trace.WriteLine("WS:用户上线"); |
依赖不兼容
自动迁移后的包
我们发现自动迁移后有些包是不可用的。
1 | <ItemGroup> |
发现很多库不支持.net core
要找对应支持的版本进行替换
更换后的包
1 | <ItemGroup> |
其中有的库要找Core版本的,如
ImageProcessor
=>ImageProcessor.Core
LiveCharts.Wpf
=>LiveCharts.Wpf.Core`.
有的库就要换成新的了
SuperWebSocket
=>TouchSocket
Imazen.WebP
=>https://github.com/psvmc/Imazen.WebP
预生成事件保持不变
1 | xcopy /Y /i /e $(ProjectDir)\wwwroot $(TargetDir)\wwwroot |
程序不包含适合于入口点
报错
程序不包含适合于入口点的静态 “Main” 方法
解决方式
生成操作选择 应用程序定义
自定义工具输入 MSBuild:Compile
配置文件读写
.net framework的读写方式
以前配置在App.config
中的appSettings
下
之前的读写方法
1 | /// <summary> |
迁移后就不能用了,原来的配置文件变成了
相应的读写方法也变了。
.net6读取appsettings.json
Nuget 安装 Microsoft.Extensions.Configuration
1 | using Microsoft.Extensions.Configuration; |
但是只支持读取配置了,不支持写入,所以要把项目运行时读写的字段换一种方式。
其实这也是合理的,我也推荐项目本身的配置和项目运行的配置分开保存,项目的配置只能读取,运行中的配置则可以读写。
下面两种方式任取其一即可。
推荐使用JSON方式。
XML方式读写
1 | using System; |
JSON方式读写
1 | using Newtonsoft.Json; |
输出精简
多运行时精简
输出目录中创建了一个名为runtime
的文件夹,里面有很多与平台相关的dll。
解决方法
在csproj文件中的PropertyGroup
中,将SelfContained
属性设置为false
并指定一个RuntimeIdentifier
;
如下所示:
1 | <PropertyGroup> |
64位的
1 | <PropertyGroup> |
多语言精简
我们没有为项目指定语言, 所以会列出多种语言。
解决方法:
在csproj文件中的PropertyGroup
中,
1 | <PropertyGroup> |