Значение изменения App.Config

Это мой App.Config

      

С помощью этого кода я делаю изменения

 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 не сохраняет изменения в файле конфигурации. Он просто меняет его в памяти. Если вы установите точку останова в 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"); } } 

Из этого сообщения: http://vbcity.com/forums/t/152772.aspx

Один из основных моментов, который следует отметить выше, заключается в том, что если вы используете это из отладчика (в Visual Studio), то файл app.config будет перезаписываться каждый раз при его создании. Лучший способ проверить это – создать ваше приложение, а затем перейти к выходному каталогу и запустить из него исполняемый файл. В выходном каталоге вы также найдете файл с именем YourApplicationName.exe.config, который является вашим файлом конфигурации. Откройте это в Блокноте, чтобы увидеть, что изменения фактически сохранены.

при использовании « ConfigurationUserLevel.None » ваш код выполняется правильно, когда вы нажимаете файл nameyourapp.exe в папке отладки. ,
но когда вы делаете развивающееся приложение на визуальном stdio, не бегите! потому что запускается «vshost.exe».

следующий параметр разрешает эту проблему: « Application.ExecutablePath »

попробуйте это: (Протестировано в VS 2012 Express для рабочего стола)

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

Без этого новое значение все еще записывалось в файл конфигурации, но старое значение было получено при отладке.

Для консольного приложения .NET 4.0 ни один из них не работал для меня. Поэтому я изменил ответ Кевн Энми, как показано ниже, и это сработало:

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

Только первая строка отличается, построенная на фактической исполнительной сборке.

Спасибо Яхмичу за ответ. Работал правильно для меня.

другой полезный fragment кода, который считывает значения и возвращает строку:

 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; } 
  • C # reflection и поиск всех ссылок
  • Компонент GCC не может найти стандартную библиотеку?
  • Надежное определение количества элементов в массиве
  • Как получить пересечение между двумя массивами как новый массив?
  • Обнаружение честных веб-сканеров
  • Как создать пул streamов, используя boost в C ++?
  • Возможное непреднамеренное сравнение ссылок
  • Правила аннулирования Iterator
  • Освобождение отключаемого виртуального последовательного порта
  • Как я могу использовать атрибуты проверки данных в C # в контексте nonASP.net?
  • Перемещение GameObject вперед и назад
  • Давайте будем гением компьютера.