我有一个配置文件app.exe.config和appSettings部分有类似的内容:
<configuration>
<appSettings configSource="app.file.config" />
</configuration>
app.file.config文件有这样的内容:
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
我需要在运行时编辑var1,var2和var3,我有这样的代码:
Configuration config = ConfigurationManager.OpenExeConfiguration("...path\app.exe);
config.AppSettings.SectionInformation.ConfigSource = "app.file.config";
config.AppSettings.Settings["var1"].Value = "value 11";
config.AppSettings.Settings["var2"].Value = "value 22";
config.AppSettings.Settings["var3"].Value = "value 33";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
当我运行config.Save ....文件app.file.config有一个appSettings节点,其属性为&#34; file&#34;。此属性具有app.file.config
的值<appSettings file="app.file.config">
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
现在,如果我尝试加载配置文件,我会收到一条消息&#34;无法识别的属性&#39;文件&#39;。请注意,属性名称区分大小写。&#34;在app.file.config中。
如果我手动删除文件属性,则会正确加载配置文件。
有什么想法吗?
保存配置文件时,如何避免写入文件属性。
由于
答案 0 :(得分:12)
使用外部配置文件对应用程序是透明的,
这部分是o.k
</configuration>
<appSettings configSource="app.file.config" />
</configuration>
还有这个:
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
将您的代码更改为:
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["var1"].Value = "value 11";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
引用外部配置文件对应用程序是透明的, 所以你不必直接打电话。您可以使用配置管理器中的默认appSetting部分。
祝你好运答案 1 :(得分:3)
警告:如其他答案中所述,configSource不是正确的答案。
现在有了坏消息......如果你更新ConfigurationManager读入的值,任何外部文件都不会保存。
设定: 命令行项目 app.config文件:
<appSettings file="AppSettings.config">
<add key="test" value="MAIN" />
</appSettings>
带有“复制到输出目录”的AppSettings.config文件=“始终复制”
<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="test" value="OVERRIDDEN"/>
</appSettings>
的Program.cs:
Console.WriteLine("Local Config sections");
try
{
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Console.WriteLine("[test]=" + config.AppSettings.Settings["test"].Value);
Console.WriteLine("[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("press the ENTER key to end");
Console.ReadLine();
TEST1 - 由子配置'configSource'文件覆盖的appsettings
安排:
将app.config更改为使用'configSource'
<appSettings configSource="AppSettings.config">
法案:RunProject
断言:引发异常:“每个配置文件只能出现一次。”
TEST2 - 由子配置'configSource'文件覆盖的appsettings
安排:
将app.config更改为使用'file'
<appSettings file="AppSettings.config">
法案:RunProject
断言:
config.AppSettings.Settings [“test”]。Value = OVERRIDDEN
config.AppSettings.Settings [“testExternalOnly”]。Value = INITIALSTATE
现在有了坏消息......如果使用
,任何外部文件都不会保存config.AppSettings.Settings["test"].Value = "NEW";
AppSettings只会保存在.exe.config文件中,然后如果您关闭并打开配置,则值将被外部文件值覆盖。
TEST3 - 外部文件中的值未在'config.Save'上更新
设定: Program.cs改为:
Console.WriteLine("Local Config sections");
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Console.WriteLine("BEFORE[test]=" + config.AppSettings.Settings["test"].Value);
Console.WriteLine("BEFORE[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value);
config.AppSettings.Settings["test"].Value = "NEW";
config.AppSettings.Settings["testExternalOnly"].Value = "NEWEXTERNAL";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
//Shut current config
config = null;
//Open config
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Console.WriteLine("AFTER[test]=" + config.AppSettings.Settings["test"].Value);
Console.WriteLine("AFTER[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value);
Console.WriteLine("AFTER CONFIG EXTERNAL FILE: " + System.IO.File.ReadAllText("AppSettings.config"));
Console.WriteLine("AFTER CONFIG FILE: " + System.IO.File.ReadAllText(System.AppDomain.CurrentDomain.FriendlyName + ".config"));
法案:运行程序
断言:
{myExe} .exe.confg的AppSettings部分是:
<appSettings file="AppSettings.config">
<add key="test" value="NEW" />
<add key="testExternalOnly" value="NEWEXTERNAL" />
</appSettings>
AppSettings.config未更改
答案 2 :(得分:-1)
最后,我找到了解决方案。
解决方案是将配置文件声明为:
<appSettings configSource="app.file.config">
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
从代码
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
AppSettingsSection myAppSettings = config.GetSection("appSettings")
myAppSettings.Settings["var1"].Value = "value 11";
config.Save(ConfigurationSaveMode.Modified);
请注意我使用 GetSection( “的appSettings”) 代替 config.AppSettings.Settings
感谢所有帮助StackOverflow的人。