升级前必须确认三件事:一是.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 风格
这是所有后续操作的前提。旧项目通常含 和大量 手动引用,必须清理。
- 新建一个空的
.NET 8控制台项目,对比其csproj结构:它只有和少量net8.0 - 将原项目中所有
删除;.NET 8 自带 BCL,多数基础类库不再需要显式引用 - 把
替换为,并添加net8.0 声明(或直接用顶层Microsoft.NET.Sdk Sdk=属性) - 若用到 WPF:加
;Windows Forms:加true 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 版本号临时删掉,然后逐个执行:
dotnet list package --outdated
再重点检查这些包是否支持 net8.0:
-
Newtonsoft.Json:可用,但建议切到System.Text.Json(.NET 8 原生高性能) -
log4net:最新版支持 net8.0,但需确认是否用了反射/自定义 AppDomain 功能(.NET Core+ 已移除 AppDomain) -
Autofac、MediatR、EF Core:全部支持,但 EF6 不支持 .NET 8,必须升到Microsoft.EntityFrameworkCore8.x - 私有 NuGet 或 COM 组件:几乎必然失败,需重写封装层或找替代方案
真正麻烦的从来不是语法或配置,而是那些藏在 App.config 里、靠 Activator.CreateInstance 动态加载、依赖 GAC 或注册表路径的逻辑——它们不会报编译错,但会在运行时静默失败。










