C# 读写App.config配置文件的方法
前言:
1.app.config
作为开发时配置参数的文件,可以在vs开发时右键属性设置是否复制到可执行程序同目录下(默认始终不复制)。在不复制的情况下,编译生成可执行程序时会copy该文件为*.exe.config文件和*.vshost.exe.config文件。这样的话,在*/bin/debug/ 或者*/bin/release/目录下就不会有app.config文件了,对应的有exe.config和vshost.exe.config。
以后运行exe文件所操作的配置文件(通过System.Configuration对象,
System.Configuration config= System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));
直接修改的是exe.config文件。
2.*.exe.config
vs调试编译时,如果app.config文件有修改,则会重新copy覆盖到exe.config和vshost.exe.config文件中,否则exe.config不会改变。exe.config文件为程序实际运行时(直接运行.exe程序)直接操作的配置文件。
3.*.vshost.exe.config
该文件主要是在vs调试运行时起作用,在调试运行程序时(*vshost.exe -> *.exe)先copy *.exe.config覆盖*.vshost.exe.config,然后运行程序时操作的配置文件为*.vshost.exe.config.在调试程序结束时(*.exe -> *.vshost.exe)
再次copy *.exe.config覆盖*.vshost.exe.config。 所有调试情况下无论怎么修改配置文件,程序退出后都不会修改配置文件(还原了)。
所以在vs调试运行程序时通过配置文件来记录之前的操作无法生效。

核心作用:解耦配置与代码,提升程序的可维护性和灵活性
这是 App.config 最根本的作用,也是它存在的核心意义。
无配置文件的问题
如果把数据库连接串、接口地址、超时时间这些参数直接写在代码里(硬编码),会出现两个致命问题:
生产环境需要修改数据库地址时,必须打开 VS 改代码、重新编译、重新发布程序,步骤繁琐且易出错;
配置项分散在各个窗体 / 类中,后期维护时要逐行找代码,效率极低。
有配置文件的优势
所有可变配置集中管理在 App.config 中,修改配置仅需用记事本打开 exe 同目录的 config 文件编辑,保存后重启程序即可生效,全程无需接触代码、无需重新编译,极大降低维护成本。
示例对比:
硬编码(不推荐):string connStr = “Data Source=192.168.1.100;Initial Catalog=TestDB;User ID=sa;Password=123456”;
配置文件(推荐):代码中仅写读取逻辑,连接串存在 App.config,修改时直接改配置文件即可。
常见配置文件模式:
<configuration>
<configSections> //配置节声明区域,包含配置节和命名空间声明
<section> //配置节声明
<sectionGroup> //定义配置节组
<section> //配置节组中的配置节声明
<appSettings> //预定义配置节
<Custom element for configuration section> //配置节设置区域
App.config 中 <appSettings>(普通键值对)和<connectionStrings>(连接字符串)是最常用的两个节点,下面讲解读取 (最常用)和修改(运行时动态更新)的实现代码。下面是一个最常见的应用程序配置文件的例子,有appSettings和configSections节:
App.config文件配置
<?xml version="1.0" encoding="utf-8"?><configuration><appSettings><addkey="Email"value="admin@admin.com"/><addkey="Password"value="123456"/><addkey="SmtpServer"value="smtp.admin.com"/><addkey="SystemName"value="WinForm配置示例"/><addkey="RequestTimeout"value="5000"/></appSettings><connectionStrings><addname="SqlConn"connectionString="Data Source=.;Initial Catalog=TestDB;User ID=sa;Password=123456;Integrated Security=False"providerName="System.Data.SqlClient"/></connectionStrings></configuration>
public partial class Server : Form{privatevoidServer_Load(object sender, EventArgs e){LoadAppParam(); //加载SaveAppParam(); //保存}publicvoidLoadAppParam(){string str1 = ConfigurationManager.AppSettings["Email"].ToString();string str2 = ConfigurationManager.AppSettings["Password"].ToString();string str3 = ConfigurationManager.AppSettings["SmtpServer"].ToString();string str4 = ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString;}publicvoidSaveAppParam(){Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);config.AppSettings.Settings["Email"].Value = "admin@admin.com1";config.AppSettings.Settings["Password"].Value = "12345678";config.AppSettings.Settings["SmtpServer"].Value = "smtp.admin.com";config.AppSettings.SectionInformation.ForceSave = true;//保存文件config.Save(ConfigurationSaveMode.Modified);//重新加载改变的节点ConfigurationManager.RefreshSection("appSettings");}}

PS:本文章属个人学习总结,部分内容参考互联网上的相关文章。 其中如果发现个人总结有不正确的认知或遗漏的地方请评论告知,欢迎交流。
往 期 回 顾
觉得有收获?不妨分享让更多人受益
关注「DotNET探索求知」,共同提升技术实力
夜雨聆风
