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

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,可以把配置项的范围从「用户」改成「应用程序」:

  1. 打开项目的「Properties」→「Settings」页面
  2. 找到cport项,把「范围」改成「应用程序」

但要注意:应用程序范围的配置默认是只读的,Settings.Default.Save()不会生效,还是得用上面的ConfigurationManager方式来修改,而且同样面临权限问题,所以这个方案不如直接用ConfigurationManager来得直接。

内容的提问来源于stack exchange,提问作者T. Kogler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:48:16