.NET 5迁移至.NET 6官方迁移文档表述不清晰问题咨询
.NET 5 迁移 .NET 6 时 Program.cs 与 Startup.cs 合并配置方案
官方给出的最小宿主示例代码全部放置在新的Program.cs文件中即可。.NET 6 引入了顶级语句(Top-level Statements)特性,不需要显式编写Program类、Main入口方法,也不需要强制包裹命名空间,编译器会自动完成入口程序的生成逻辑。
具体迁移步骤
- 第一步:整理using引用
把原Program.cs、Startup.cs中用到的所有using引用全部放在Program.cs最顶部即可。如果你的项目没有关闭.NET 6默认启用的隐式using配置,ASP.NET Core相关的常用命名空间不需要手动引入。 - 第二步:映射原Program类的宿主构建逻辑
删掉原Program类中Main方法、CreateHostBuilder相关的旧代码,第一行直接写宿主构建入口:
如果你需要读取配置、获取环境信息,直接通过var builder = WebApplication.CreateBuilder(args);builder.Configuration、builder.Environment访问即可,和你之前在Startup构造函数里拿到的对象完全一致。 - 第三步:映射原Startup.ConfigureServices方法的服务注册逻辑
把原Startup类ConfigureServices方法里的所有代码,全部挪到builder对象声明之后、builder.Build()调用之前,统一通过builder.Services完成服务注册,示例:// 原ConfigureServices里的服务注册代码全部放这里 builder.Services.AddRazorPages(); builder.Services.AddDbContext<WebAppDbContext>(opt => opt.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")) ); builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(); - 第四步:构建应用对象,映射原Startup.Configure方法的中间件逻辑
所有服务注册完成后,调用Build方法拿到应用实例,把原Startup类Configure方法里的中间件配置、路由映射逻辑全部挪到这部分,示例:var app = builder.Build(); // 原Configure里的中间件配置代码全部放这里 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); - 第五步:添加启动运行代码
在Program.cs最后一行添加app.Run();即可,不需要额外写Main方法包裹。
兼容方案与常见问题
- 如果你暂时不想拆分原有Startup类的逻辑,可以不用删除Startup.cs,直接在Program.cs里调用原有Startup的方法,代码如下:
这是官方支持的兼容写法,不会影响运行,但长期维护建议还是迁移到顶级语句的简化写法。var builder = WebApplication.CreateBuilder(args); var startup = new Startup(builder.Configuration); startup.ConfigureServices(builder.Services); var app = builder.Build(); startup.Configure(app, app.Environment); app.Run(); - 如果集成测试等场景需要引用Program类,只需要在Program.cs的最后添加一行分部类声明即可,不需要修改其他逻辑:
public partial class Program { } - 不需要给Program.cs里的顶级语句代码包裹项目命名空间,编译器自动生成的Program类不会和你项目里的其他类产生命名冲突。
内容的提问来源于stack exchange,提问作者serge
相关产品推荐
相关产品推荐

