升级前必须确认的三件事
直接运行
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 风格
这是所有后续操作的前提。旧项目通常含
<targetframeworkversion>v4.7.2</targetframeworkversion>和大量
<reference></reference>手动引用,必须清理。 新建一个空的
.NET 8控制台项目,对比其
csproj结构:它只有
<targetframework>net8.0</targetframework>和少量
<packagereference></packagereference>将原项目中所有
<reference include="..."></reference>删除;.NET 8 自带 BCL,多数基础类库不再需要显式引用 把
<targetframeworkversion></targetframeworkversion>替换为
<targetframework>net8.0</targetframework>,并添加
<sdk>Microsoft.NET.Sdk</sdk>声明(或直接用顶层
Sdk=属性) 若用到 WPF:加
<usewpf>true</usewpf>;Windows Forms:加
<usewindowsforms>true</usewindowsforms>
常见编译错误及对应解法
改完 csproj 后首次构建,大概率报错。以下是最常撞上的几个点:
The type or namespace name 'WebClient' does not exist→ 加
<packagereference include="System.Net.WebClient" version="8.0.0"></packagereference>(该类型已从 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 中加
<generateruntimeconfigurationfiles>true</generateruntimeconfigurationfiles>
第三方库兼容性怎么快速验证
别靠猜。打开
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 或注册表路径的逻辑——它们不会报编译错,但会在运行时静默失败。
