【问题标题】:App.Config change valueApp.Config 更改值
【发布时间】:2012-06-24 08:39:03
【问题描述】:

这是我的 App.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="lang" value="English"/>
  </appSettings>
</configuration>

使用此代码我进行更改

lang = "Russian";
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
     System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);
}

但它不会改变。我做错了什么?

【问题讨论】:

标签: c# app-config


【解决方案1】:

AppSettings.Set 不会将更改保留到您的配置文件中。它只是在内存中改变它。如果你在System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang); 上设置一个断点,并为System.Configuration.ConfigurationManager.AppSettings[0] 添加一个监视,当那行代码运行时,你会看到它从“English”变为“Russian”。

以下代码(在控制台应用程序中使用)将保留更改。

class Program
{
    static void Main(string[] args)
    {
        UpdateSetting("lang", "Russian");
    }

    private static void UpdateSetting(string key, string value)
    {
        Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        configuration.AppSettings.Settings[key].Value = value;
        configuration.Save();

        ConfigurationManager.RefreshSection("appSettings");
    }
}

来自这篇帖子: http://vbcity.com/forums/t/152772.aspx

上面需要注意的一点是,如果您从调试器(在 Visual Studio 中)运行它,那么每次构建时都会覆盖 app.config 文件。最好的测试方法是构建您的应用程序,然后导航到输出目录并从那里启动您的可执行文件。在输出目录中,您还将找到一个名为 YourApplicationName.exe.config 的文件,它是您的配置文件。在记事本中打开它,查看更改实际上已保存。

【讨论】:

  • 那我该如何做出改变?
  • System.Configuration.ConfigurationManager.AppSettings[0] 不会一个人做任何事...请填写代码
  • 所以我必须写 System.Configuration.ConfigurationManager.AppSettings[0] = lang?因为那给了我错误
  • 我复制了你的代码并在 VS 2012 c# 4.5 上运行,它不工作。我确实检查了 bin/debug 文件夹配置文件。它仅在我添加接受的答案中给出的“configFileMap”时才有效
  • 对于更健壮的代码,如果密钥已经存在,您可以添加一个测试:if (configuration.AppSettings.Settings[key] == null) configuration.AppSettings.Settings.Add(key, value); else configuration.AppSettings.Settings[key].Value = value;
【解决方案2】:

您不能为此使用 AppSettings 静态对象。试试这个

string appPath = System.IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location);          
string configFile = System.IO.Path.Combine(appPath, "App.config");
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();         
configFileMap.ExeConfigFilename = configFile;          
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

config.AppSettings.Settings["YourThing"].Value = "New Value"; 
config.Save(); 

【讨论】:

  • 但它会重新启动...我在表单关闭时进行更改...当我再次运行程序时没有任何变化
  • 你有什么例外吗?你在使用 WinForms 吗?
  • 在我的带有 Visual Studio 2013 Ultimate 的 .Net (4.5) 上,我可以拥有 System.Configuration 但没有像 System.Configuration.Configuration 这样的对象。
  • 设置值时会抛出 NullReferenceException。尽管我的 appSettings 中有一个键,但 config.AppSettings.Settings 计数为零。我在 c# 4.5
  • @TechJerk 您使用的是 app.config 还是 web.config?
【解决方案3】:

当使用“ConfigurationUserLevel.None”时,当您单击调试文件夹中的 nameyourapp.exe 时,您的代码会正确运行。 .
但是当你在视觉标准输出上开发应用程序时运行不正确!因为“vshost.exe”正在运行。

以下参数解决了这个问题: "Application.ExecutablePath"

试试这个:(在 VS 2012 Express For Desktop 中测试)

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["PortName"].Value = "com3";
config.Save(ConfigurationSaveMode.Minimal);

我的英文不好,对不起。

【讨论】:

    【解决方案4】:

    这在 WPF 应用程序中对我有用:

    string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
    Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
    config.AppSettings.Settings["currentLanguage"].Value = "En";
    config.Save();
    

    【讨论】:

    • @jned29 如果对您有帮助,请随时支持我的回答:)。
    【解决方案5】:
        private static string GetSetting(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }
    
        private static void SetSetting(string key, string value)
        {
            Configuration configuration =
                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            configuration.AppSettings.Settings[key].Value = value;
            configuration.Save(ConfigurationSaveMode.Full, true);
            ConfigurationManager.RefreshSection("appSettings");
        }
    

    【讨论】:

    • 您可能不想将配置保存在 ConfigurationSaveMode.Full 中。这会在您的 app.config 中添加大量您不想要的内容。其余的都很好。
    • 您可能还想结合Application.ExecutablePath 选项来调用OpenExeConfiguration,如@Amin Ghaderi 的回答中所述
    【解决方案6】:

    除了 fenix2222 的答案(对我有用)之外,我还必须将最后一行修改为:

    config.Save(ConfigurationSaveMode.Modified);
    

    没有这个,新值仍在写入配置文件,但在调试时检索旧值。

    【讨论】:

      【解决方案7】:

      对于 .NET 4.0 控制台应用程序,这些都不适合我。所以我修改了 Kevn Aenmey 的答案,如下所示:

      private static void UpdateSetting(string key, string value)
      {
          Configuration configuration = ConfigurationManager.
              OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
          configuration.AppSettings.Settings[key].Value = value;
          configuration.Save();
      
          ConfigurationManager.RefreshSection("appSettings");
      }
      

      只有第一行不同,根据实际执行的程序集构建。

      【讨论】:

        【解决方案8】:

        感谢 Jahmic 的回答。 对我来说工作正常。

        另一个有用的代码 sn-p 读取值并返回一个字符串:

        public static string ReadSetting(string key)
            {
                System.Configuration.Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                System.Configuration.AppSettingsSection appSettings = (System.Configuration.AppSettingsSection)cfg.GetSection("appSettings");
                return appSettings.Settings[key].Value;
        
            }
        

        【讨论】:

          【解决方案9】:

          要更新appsettings 以外的条目,只需使用XmlDocument

          public static void UpdateAppConfig(string tagName, string attributeName, string value)
          {
              var doc = new XmlDocument();
              doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
              var tags = doc.GetElementsByTagName(tagName);
              foreach (XmlNode item in tags)
              {
                  var attribute = item.Attributes[attributeName];
                  if (!ReferenceEquals(null, attribute))
                      attribute.Value = value;
              }
              doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
          }
          

          这就是你的称呼:

          Utility.UpdateAppConfig("endpoint", "address", "http://localhost:19092/NotificationSvc/Notification.svc");
          
          Utility.UpdateAppConfig("network", "host", "abc.com.au");
          

          可以改进此方法以适应 appSettings 值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-24
            • 1970-01-01
            • 2015-08-18
            • 2011-01-01
            • 2010-12-05
            • 1970-01-01
            • 1970-01-01
            • 2015-07-12
            相关资源
            最近更新 更多