升级前必须确认三件事:一是.NET 8 已移除 dotnet migrate 命令,需手动重构;二是.NET Framework 与 .NET 8 运行时不兼容,不能仅改 TargetFramework;三是项目是否为 SDK 风格 csproj,否则必须先转换格式。
升级前必须确认的三件事
直接运行 dotnet migrate 会失败——.NET 8 没有这个命令,官方已移除迁移工具。你真正需要的是手动重构 + 工具辅助判断,而不是一键转换。
-
.NET Framework(如 4.7.2)和.NET 8是不同运行时,不兼容:不能仅改 TargetFramework 就跑起来 - 项目类型决定迁移路径:
csproj格式是否已是 SDK 风格?不是的话必须先转格式,否则 NuGet、编译、发布全卡住 - Windows Forms/WPF 项目可迁,但需启用
UseWPF或UseWindowsForms,且部分 API(如System.Drawing在非 Windows 上行为受限)要替换
第一步:把传统 .NET Framework csproj 改成 SDK 风格
这是所有后续操作的前提。旧项目通常含 v4.7.2 和大量 手动引用,必须清理。
- 新建一个空的
.NET 8控制台项目,对比其csproj结构:它只有net8.0和少量 - 将原项目中所有
删除;.NET 8 自带 BCL,多数基础类库不再需要显式引用 - 把
替换为net8.0,并添加Microsoft.NET.Sdk声明(或直接用顶层Sdk=属性) - 若用到 WPF:加
true;Windows Forms:加true
常见编译错误及对应解法
改完 csproj 后首次构建,大概率报错。以下是最常撞上的几个点:
-
The type or namespace name 'WebClient' does not exist→ 加(该类型已从 BCL 移出) -
'Assembly.GetExecutingAssembly().Location' returns empty string→ 改用typeof(Program).Assembly.Location或更推荐AppContext.BaseDirectory -
Could not load file or assembly 'System.Data, Version=4.0.0.0'→ 删除所有System.Data相关Reference,改用System.Data.Common+Microsoft.Data.SqlClient包 -
ConfigurationManager.AppSettings不可用 → 引入System.Configuration.ConfigurationManagerNuGet 包,并在 csproj 中加true
第三方库兼容性怎么快速验证
别靠猜。打开 csproj,把所有 PackageReference 版本号临时删掉,然后逐个执行: