在外部文件中编写appSettings

时间:2014-12-29 15:29:58

标签: c# .net config

我有一个配置文件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中。

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

有什么想法吗?

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

由于

3 个答案:

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