如何在.NET 5控制台应用中正确配置,还原.NET Framework的app.config读取行为
解决方案
方案1:完全复刻.NET Framework旧行为(零业务代码改动)
这是最适配你需求的方案,不需要接入新的.NET配置体系,原有读写app.config的代码可以完全保留:
- 首先安装NuGet包
System.Configuration.ConfigurationManager - 确保项目根目录下的
app.config文件属性设置为:复制到输出目录 = 如果较新则复制 - 原有代码直接复用即可,比如
ConfigurationManager.AppSettings["你的配置键"]、ConfigurationManager.ConnectionStrings["你的连接串名"]的调用逻辑完全不需要修改,和.NET Framework下的行为完全一致。
方案2:接入新配置系统(无需通用主机)
如果你后续需要支持多配置源、环境变量、命令行参数等新特性,也可以不引入通用主机,直接在Main入口初始化配置:
- 先安装必要的NuGet包:
Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Xml - 在
Main方法最开始构造配置对象,之后直接在业务逻辑中读取即可:
static void Main(string[] args) { IConfiguration config = new ConfigurationBuilder() .AddXmlFile("app.config", optional: false, reloadOnChange: true) // 可以根据需要添加其他配置源,比如AddJsonFile、AddEnvironmentVariables等 .Build(); // 你的原有业务逻辑直接从这里开始写,直接读取config即可 var configValue = config.GetSection("appSettings:add:你的配置键").Value; }
关于官方文档示例的说明
官方示例中的await host.RunAsync()仅适用于需要运行长期后台托管服务的场景,普通一次性控制台程序完全不需要调用这行代码。如果你非要使用通用主机的初始化逻辑,只需要在host.Build()完成后直接从依赖注入容器中取出配置对象使用即可,所有业务逻辑都可以写在host.RunAsync()之前,不需要等待主机运行。
示例如下:
static void Main(string[] args) { using IHost host = CreateHostBuilder(args).Build(); // 直接取出配置使用 var config = host.Services.GetRequiredService<IConfiguration>(); // 你的所有业务逻辑写在这里,执行完成后程序直接退出即可 // 不需要添加host.RunAsync()调用 }
内容的提问来源于stack exchange,提问作者Mason Wheeler
相关产品推荐
相关产品推荐

