.NET中.Settings配置文件无法返回更新后的配置值
解决类库Settings文件更新后控制台项目无法获取新值的问题
我太懂你这个糟心的问题了——类库的.Settings配置明明已经复制到控制台项目的bin目录,改了配置却死活读不到新值,这其实是.Settings的默认机制和配置加载逻辑在搞鬼,咱们一步步来解决:
先搞懂为啥会这样
- 静态缓存坑:自动生成的
UtilityConfig.Default是个静态实例,第一次读取配置后就会把值缓存起来,除非你主动触发刷新,不然它就一直用旧值。 - 配置加载路径错了:控制台应用运行时,默认只会读取自己的
EpmTfs.Console.exe.config,而不是类库的EpmTfs.Common.dll.config。你看到复制到bin目录的类库配置文件,其实根本没被Settings类正确加载,它用的还是编译时嵌入的默认值或者第一次启动时读的旧数据。
给你几个实用的解决方案
方案一:主动刷新缓存(快速临时解决)
如果你不想改太多代码,每次读取配置前手动调用Reload()方法,强制它重新读取配置文件:
// 先刷新再读取 Common.UtilityConfig.Default.Reload(); string pwd = Common.UtilityConfig.Default.passWord; string userName = Common.UtilityConfig.Default.userName;
不过这个方法要每次读取都加,有点繁琐,而且如果配置文件路径不对还是白搭。
方案二:合并配置到控制台的App.config(规范做法)
这是工业界常用的方式,把类库的配置整合到控制台项目的主配置文件里:
- 打开控制台项目的
App.config(编译后会变成EpmTfs.Console.exe.config) - 找到类库生成的
EpmTfs.Common.dll.config,把里面的<userSettings>节点完整复制到控制台的App.config里,比如:
<configuration> <!-- 保留原有的其他节点 --> <userSettings> <EpmTfs.Common.UtilityConfig> <setting name="passWord" serializeAs="String"> <value>你的新密码</value> </setting> <setting name="userName" serializeAs="String"> <value>你的新用户名</value> </setting> </EpmTfs.Common.UtilityConfig> </userSettings> </configuration>
- 之后你只要修改控制台的
EpmTfs.Console.exe.config,重启应用(或者调用Reload())就能读到新值了,类库的Settings会自动从主配置文件里读取数据。
方案三:手动指定类库配置文件加载(适合单独管理配置的场景)
如果一定要单独维护类库的配置文件,那就绕开自动生成的Settings类,直接读取指定的配置文件:
using System.Configuration; using System.IO; using System.Reflection; // 构造类库配置文件的路径 string configPath = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "EpmTfs.Common.dll.config" ); // 创建配置映射 ExeConfigurationFileMap configMap = new ExeConfigurationFileMap { ExeConfigFilename = configPath }; // 加载配置 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); UserSettingsSection userSettings = (UserSettingsSection)config.GetSection("userSettings"); // 读取具体配置项 string pwd = userSettings.SettingsGroups["EpmTfs.Common.UtilityConfig"].Settings["passWord"].Value.ValueXml.InnerText; string userName = userSettings.SettingsGroups["EpmTfs.Common.UtilityConfig"].Settings["userName"].Value.ValueXml.InnerText;
这个方法完全自主控制配置文件的读取,适合类库需要独立配置的场景。
最后提个小注意点
如果你在Visual Studio调试时修改了bin目录的配置,要确保控制台应用没在运行(不然文件被锁定,修改不会生效);另外可以把类库项目里的.Settings文件的“复制到输出目录”设置为如果较新则复制,避免每次编译都覆盖你手动修改的配置。
内容的提问来源于stack exchange,提问作者punjabi
相关产品推荐
相关产品推荐

