You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 17:47:37