在外部文件中编写appSettings

我有一个配置文件app.exe.config和appSettings部分有这样的:

   

app.file.config文件有这样的东西:

       

我需要在运行时编辑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节点,其属性为“file”。 此属性具有app.file.config的值

      

现在,如果我尝试加载配置文件,我有一个例外,消息“无法识别的属性’文件’。请注意,属性名称区分大小写。” 在app.file.config中。

如果手动删除文件属性,则会正确加载配置文件。

有任何想法吗?

保存配置文件时如何避免写入文件属性。

谢谢

使用外部配置文件对于应用程序是透明的,

这部分还可以

    

还有这个:

       

将您的代码更改为:

 Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); config.AppSettings.Settings["var1"].Value = "value 11"; config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); 

引用外部配置文件对应用程序是透明的,因此您不必直接调用它。 您可以使用配置管理器中的默认appSetting部分。

祝好运

警告 :configSource不是正确答案,如其他答案中所述。

现在,对于坏消息……如果更新ConfigurationManager读入的值,则不会保存任何外部文件。

设置:命令行项目app.config文件:

    

带有’复制到输出目录’的AppSettings.config文件=’总是复制’

     

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’

  

行动:RunProject

断言:引发exception:“每个配置文件只能出现一次。”

TEST2 – 由子配置’configSource’文件覆盖的appsettings

安排:

将app.config更改为使用’file’

  

行动: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.config未更改

最后,我找到了解决方案。

解决方案是将配置文件声明为:

      

从代码

 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的人。