配置文件几乎是每个C#项目都绕不开的东西,数据库连接串、接口地址、开关参数,这些经常变动的值总不能硬编码在代码里。传统.NET Framework项目用的是app.config,而.NET Core之后微软主推appsettings.json,两套体系的读取方式完全不同。本文就把这两种方式的完整用法讲清楚,包括配置绑定、分环境加载等进阶技巧,帮你彻底搞定C#读取配置文件这件事。

一、使用ConfigurationManager读取app.config
app.config是.NET Framework时代的标准配置文件,编译后会输出为「程序名.exe.config」。读取它主要依赖System.Configuration.ConfigurationManager类,这个类位于System.Configuration程序集中,使用前需要先在项目里添加对该程序集的引用。
app.config里最常用的两个节点是<appSettings>和<connectionStrings>。前者存放键值对形式的自定义配置,后者专门存放数据库连接字符串。下面是一个典型的app.config内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ApiUrl" value="https://api.ipipp.com/v1"/>
<add key="RetryCount" value="3"/>
</appSettings>
<connectionStrings>
<add name="DefaultDb"
connectionString="Data Source=.;Initial Catalog=Test;Integrated Security=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
读取代码非常简单,直接调用静态方法即可:
using System.Configuration; // 读取appSettings节点 string apiUrl = ConfigurationManager.AppSettings["ApiUrl"]; string retry = ConfigurationManager.AppSettings["RetryCount"]; int retryCount = int.Parse(retry); // 读取connectionStrings节点 string connStr = ConfigurationManager.ConnectionStrings["DefaultDb"].ConnectionString;
需要注意的是,ConfigurationManager.AppSettings返回的是字符串,取不到值时为null而不是抛异常,所以解析成数字前最好做判空处理,或者用int.TryParse来避免格式错误导致崩溃。另外,类库项目(Class Library)里的app.config在运行时并不会被读取,实际生效的是最终可执行项目中的那份配置文件,这是很多人踩过的坑。
如果想在运行时修改并保存配置,可以使用Configuration对象的Save方法,但要注意程序目录可能没有写权限,而且这种方式修改的是exe.config文件,下次启动才会读到新值,一般不推荐在代码里频繁改配置。
二、在.NET Core及更高版本中读取appsettings.json
到了.NET Core时代,配置体系被彻底重做,默认使用JSON格式的appsettings.json,支持嵌套结构、数组、多环境文件覆盖。读取配置的核心接口是Microsoft.Extensions.Configuration.IConfiguration,通常在Program.cs中通过ConfigurationBuilder构建。
一个典型的appsettings.json长这样:
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"Api": {
"Url": "https://api.ipipp.com/v1",
"Timeout": 30
},
"ConnectionStrings": {
"DefaultDb": "Data Source=.;Initial Catalog=Test;Integrated Security=True"
}
}
在ASP.NET Core的Program.cs中,WebApplication.CreateBuilder已经自动加载了appsettings.json以及appsettings.Development.json等环境文件,你可以直接通过依赖注入拿到IConfiguration:
var builder = WebApplication.CreateBuilder(args);
// 直接用索引器读取,冒号表示层级
string apiUrl = builder.Configuration["Api:Url"];
string connStr = builder.Configuration.GetConnectionString("DefaultDb"];
builder.Services.AddControllers();
var app = builder.Build();
app.Run();
如果是控制台项目,需要手动构建配置。记得先通过NuGet安装Microsoft.Extensions.Configuration.Json包:
using Microsoft.Extensions.Configuration;
var config = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
string url = config["Api:Url"];
代码里的reloadOnChange: true是个很实用的参数,它开启配置热更新,文件被修改后无需重启程序就能读到新值,这是app.config做不到的。
三、用Options模式实现强类型配置绑定
直接用字符串索引器读配置虽然方便,但配置项多了以后到处都是魔法字符串,容易写错也不好维护。推荐的做法是定义一个与JSON结构对应的类,然后用Get<T>()扩展方法或Options模式做绑定:
public class ApiSettings
{
public string Url { get; set; } = string.Empty;
public int Timeout { get; set; }
}
// 方式一:直接反序列化为对象
ApiSettings api = config.GetSection("Api").Get<ApiSettings>();
// 方式二:注册到依赖注入容器(ASP.NET Core推荐)
builder.Services.Configure<ApiSettings>(builder.Configuration.GetSection("Api"));
注册之后,在Controller或Service的构造函数里注入IOptions<ApiSettings>、IOptionsSnapshot<ApiSettings>就能拿到配置对象。两者的区别在于生命周期:IOptions是单例,程序启动后值不再变化;IOptionsSnapshot是作用域级别的,每次请求重新读取,能感知到json文件的热更新。对配置时效性有要求的场景用Snapshot版本更合适。
强类型绑定的另一个好处是可以在类上配合数据注解做校验,比如用[Required]标记必填项,配合ValidateDataAnnotations在启动时就发现配置缺失,避免运行到一半才报错。
四、两种方式如何选择
选择依据其实很简单:看项目的目标框架。.NET Framework的WinForm、WPF、老WebForms项目,老老实实用app.config加ConfigurationManager,生态成熟稳定;.NET Core、.NET 5及以上以及ASP.NET Core项目,直接上appsettings.json加IConfiguration,还能顺带获得环境变量覆盖、命令行参数覆盖、Azure Key Vault集成等能力。
需要提醒两点:一是老的.NET Framework项目如果迁移到新框架,ConfigurationManager在安装System.Configuration.ConfigurationManagerNuGet包后依然可用,但更建议趁机把配置迁移到json体系;二是配置里的敏感信息(连接串、密钥)不要提交到代码仓库,生产环境可以通过环境变量或密钥管理服务注入,json文件里只保留开发环境的占位值。
总结一下,app.config的读取简单直接,一个静态类搞定;appsettings.json体系虽然概念多一些(Builder、IConfiguration、Options),但扩展性和灵活性明显更强,尤其是分环境加载和热更新这两个特性,在实际项目中非常实用。掌握这两套方案,无论接手什么年代的项目,配置读取都不会再成为问题。
C#读取配置文件appsettings.jsonConfigurationManager修改时间:2026-09-15 21:06:36