C#应用配置疑问:为何不读写exe.config?如何调整行为?
解决C#程序读写配置时不使用exe.config的问题
嘿,我完全懂你碰到的这个困惑——C#默认的Properties.Settings机制确实有点“藏着掖着”,它会把用户修改后的配置存在%AppData%下的本地文件里,而不是直接修改程序目录下的exe.config。这其实是微软的设计考量:普通用户通常没有Program Files这类系统目录的写入权限,把用户配置存在个人目录能避免权限报错。不过你既然明确要让程序直接读写exe.config,可以按下面的方案调整:
先搞懂默认行为的本质
- 你看到的“隐藏配置文件”:
Properties.Settings.Default里的用户范围配置,会被存在%UserProfile%\AppData\Local\[你的应用名称]\[版本号]路径下的专属文件里,exe.config只是程序启动时读取的默认值模板,运行时修改不会回写回去。 - 删除
exe.config报错:因为程序启动时需要读取配置的结构定义,哪怕实际运行时会用用户目录里的配置值,这个模板文件还是必不可少的。
方案:用ConfigurationManager直接操作exe.config
这是最直接的方式,能让配置读写直接作用于程序目录下的exe.config文件:
第一步:添加必要的引用
右键你的项目 → 选择「添加引用」 → 在弹出的窗口里找到System.Configuration并勾选,点击确定。
第二步:修改读取配置的代码
把原来的Settings读取代码替换成:
// 读取exe.config中appSettings节点下的cport值,找不到则用默认值 txtCPort.Text = ConfigurationManager.AppSettings["cport"] ?? "COM1";
第三步:修改写入配置的代码
替换原来的Settings写入和保存代码:
// 获取当前程序的配置对象(ConfigurationUserLevel.None表示操作程序目录下的exe.config) var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // 更新cport的值 if (config.AppSettings.Settings["cport"] != null) { config.AppSettings.Settings["cport"].Value = txtCPort.Text; } else { // 如果配置项不存在,就新增一个 config.AppSettings.Settings.Add("cport", txtCPort.Text); } // 保存修改到exe.config config.Save(ConfigurationSaveMode.Modified); // 刷新配置,让后续读取能立刻拿到新值 ConfigurationManager.RefreshSection("appSettings");
第四步:确保exe.config有正确的节点
打开你的exe.config文件,确认里面包含appSettings节点,比如:
<configuration> <appSettings> <!-- 这里是默认的端口值 --> <add key="cport" value="COM1"/> </appSettings> </configuration>
注意事项
- 权限问题:如果你的程序安装在
Program Files这类受保护的目录,普通用户运行时没有写入权限,会抛出异常。解决办法要么提示用户以管理员身份运行,要么把程序安装到用户有读写权限的目录(比如Documents下)。 - 配置结构:如果需要更复杂的配置(不是简单的键值对),可以自定义配置节,但对于你的场景,
appSettings足够用了。
备选方案:修改Settings的范围(不推荐)
如果你想继续用Properties.Settings,可以把配置项的范围从「用户」改成「应用程序」:
- 打开项目的「Properties」→「Settings」页面
- 找到
cport项,把「范围」改成「应用程序」
但要注意:应用程序范围的配置默认是只读的,Settings.Default.Save()不会生效,还是得用上面的ConfigurationManager方式来修改,而且同样面临权限问题,所以这个方案不如直接用ConfigurationManager来得直接。
内容的提问来源于stack exchange,提问作者T. Kogler
相关产品推荐
相关产品推荐

