App.Config更改值

这是我的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); } 

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

你不能使用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(); 

AppSettings.Set不会将更改持久保存到configuration文件中。 它只是改变它在内存中。 如果你在System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);上放置一个断点System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang); ,并添加监视System.Configuration.ConfigurationManager.AppSettings[0]你会看到它从“英语”更改为“俄罗斯”时,该行的代码运行。

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

 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"); } } 

从这个post: http : //vbcity.com/forums/t/152772.aspx

需要注意的一点是,如果你是从debugging器(在Visual Studio中)运行这个,那么app.config文件将在每次构build时被覆盖。 testing这个最好的方法是构build你的应用程序,然后导航到输出目录并从那里启动你的可执行文件。 在输出目录中,您还将find一个名为YourApplicationName.exe.config的文件,它是您的configuration文件。 在记事本中打开它,看看事实上已经保存了更改。

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

下面的参数解决了这个问题:“ Application.ExecutablePath

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

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

我的英语不好,我很抱歉。

这对我在WPF应用程序中工作:

 string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe"); Configuration config = ConfigurationManager.OpenExeConfiguration(configPath); config.AppSettings.Settings["currentLanguage"].Value = "En"; config.Save(); 
  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"); } 

除了fenix2222(为我工作)的答案,我不得不修改最后一行:

 config.Save(ConfigurationSaveMode.Modified); 

如果没有这个,新的值仍然被写入到configuration文件中,但debugging时检索到旧的值。

对于.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"); } 

只有第一行是不同的,build立在实际执行的程序集上。

谢谢Jahmic的答案。 为我工作正常。

另一个有用的代码片段,读取值并返回一个string:

 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; }