在外部文件中编写appSettings

J19*_*J19 9 .net c# config

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

<configuration>
    <appSettings configSource="app.file.config" />
</configuration>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我需要在运行时编辑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");
Run Code Online (Sandbox Code Playgroud)

当我运行config.Save ....文件app.file.config有一个appSettings节点,其属性为"file".此属性具有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>
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?

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

谢谢

小智 12

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

这部分还可以

</configuration>
    <appSettings configSource="app.file.config" />
</configuration>
Run Code Online (Sandbox Code Playgroud)

还有这个:

<?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>
Run Code Online (Sandbox Code Playgroud)

将代码更改为:

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

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

祝好运

  • 您好 Tomer Klein, 按照您建议的设置存储在 app.exe.config 中的方式,而不是 app.file.config 中。 (3认同)

OzB*_*Bob 5

一个更完整的答案,以防止混淆:

设置:

  1. 名为“app”的命令行项目
  2. app.exe.config 文件,App.config:

    <appSettings file="App.Settings.config"></appSettings>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 带有“复制到输出目录”=“始终复制”的 App.Settings.config 文件

    <?xml version="1.0" encoding="utf-8"?>
    <appSettings>
      <add key="test" value="OVERRIDDEN"/>
    </appSettings>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 程序.cs:

    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Local Config sections");
            var exepath = (new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase)).LocalPath;
            Configuration config = ConfigurationManager.OpenExeConfiguration(exepath);
    
            config.AppSettings.SectionInformation.ConfigSource = "App.Settings.config";
    
            Console.WriteLine("BEFORE[test]=" + config.AppSettings.Settings["test"].Value);
            Console.WriteLine($"BEFORE[testExternalOnly]={config.AppSettings.Settings["testExternalOnly"]?.Value}");
    
            //to avoid: Error CS0266
            //Explicitly cast 'System.Configuration.AppSettingsSection'
            AppSettingsSection myAppSettings = (AppSettingsSection)config.GetSection("appSettings");
    
            myAppSettings.Settings["test"].Value = "NEW";
            if (!myAppSettings.Settings.AllKeys.Contains("testExternalOnly"))
                myAppSettings.Settings.Add("testExternalOnly", "NEWEXTERNAL");
    
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
    
            //Read updated config
            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("App.Settings.config"));
    
            Console.WriteLine("AFTER CONFIG FILE: " + System.IO.File.ReadAllText(System.AppDomain.CurrentDomain.FriendlyName + ".config"));
    
    
            //Shut current config
            config = null;
    
            //Open config
            config = ConfigurationManager.OpenExeConfiguration(exepath);
            config.AppSettings.SectionInformation.ConfigSource = "App.Settings.config";
    
            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("App.Settings.config"));
    
            Console.WriteLine("AFTER CONFIG FILE: " + System.IO.File.ReadAllText(System.AppDomain.CurrentDomain.FriendlyName + ".config"));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.WriteLine("press the ENTER key to end");
        Console.ReadLine();
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

这将导致 App.Settings.config 文件更新到文件系统上,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<appSettings>
  <add key="test" value="NEW" />
  <add key="testExternalOnly" value="NEWEXTERNAL" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)


J19*_*J19 3

将配置文件声明如下:

<appSettings configSource="app.file.config">
<add key="var1" value="value 1" />
  <add key="var2" value="value 2" />
  <add key="var3" value="value 3" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

并从代码中

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
AppSettingsSection myAppSettings = config.GetSection("appSettings")
myAppSettings.Settings["var1"].Value = "value 11";
config.Save(ConfigurationSaveMode.Modified);
Run Code Online (Sandbox Code Playgroud)

请注意,我使用 GetSection("appSettings") 而不是 config.AppSettings.Settings

感谢 StackOverflow 中所有帮助人们的人。

  • @christoper-painter,@j19 实际上是有想法的。我认为他想在以编程方式保存设置时更新“app.file.config”而不是“app.exe.config”。至少这就是我想要做的,并且“configSource”属性而不是“file”正是这样做的,请参阅http://stackoverflow.com/questions/6940004/asp-net-web-config-configsource-vs -文件属性 (2认同)