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

Но это не изменится. Что я делаю не так?

 Grant22 июн. 2012 г., 04:53
 nawfal10 февр. 2014 г., 10:23
возможный дубликатWrite values in app.config file

Ответы на вопрос(8)

Это работает для меня в приложении WPF:

string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();
 08 авг. 2016 г., 11:01
Ваш код также работал для меня. Спасибо!
 08 авг. 2016 г., 14:25
@ jned29, не стесняйтесь высказать свой ответ, если он поможет вам :).
    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");
    }
 11 мая 2016 г., 15:45
Вы также можете объединить сApplication.ExecutablePath вариант для звонкаOpenExeConfiguration, как упомянуто в ответе @Amin Ghaderi
 19 июн. 2015 г., 07:43
Вы можете не захотеть сохранять конфигурацию в ConfigurationSaveMode.Full. Это добавит в файл app.config кучу вещей, которые вам не нужны. Остальное хорошо.
Решение Вопроса

Для этого нельзя использовать статический объект 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(); 
 a120477322 июн. 2012 г., 04:51
Да, я использую WinForms ... Нет исключений ...
 a120477322 июн. 2012 г., 04:47
Но он перезапускается ... Я делаю изменения при закрытии формы ... При повторном запуске программы ничего не меняется
 31 янв. 2014 г., 13:45
В моем .Net (4.5) с Visual Studio 2013 Ultimate у меня может быть System.Configuration, но нет такого объекта, как System.Configuration.Configuration.
 22 июн. 2012 г., 04:49
Вы получаете какие-либо исключения? Вы используете WinForms?
 03 июн. 2015 г., 20:37
Выдает NullReferenceException при установке значения. config.AppSettings.Settings count равен нулю, хотя у меня есть ключ в моих appSettings. Я на C # 4.5

В дополнение к ответу fenix2222 (который работал для меня) мне пришлось изменить последнюю строку на:

config.Save(ConfigurationSaveMode.Modified);

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

Для консольного приложения .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");
}

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

при использовании & quot;ConfigurationUserLevel.None& Quot; Ваш код запускается правильно, когда вы нажимаете на nameyourapp.exe в папке отладки. ,
но когда вы разрабатываете приложение на visual stdio, не запускайте! потому что & quot; vshost.exe & quot; это запустить.

Следующий параметр решает эту проблему: & Quot;Application.ExecutablePath& Quot;

try this : (Tested in VS 2012 Express For Desktop)

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

my english not good , i am sorry.

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

From this post: http://vbcity.com/forums/t/152772.aspx

One major point to note with the above is that if you are running this from the debugger (within Visual Studio) then the app.config file will be overwritten each time you build. The best way to test this is to build your application and then navigate to the output directory and launch your executable from there. Within the output directory you will also find a file named YourApplicationName.exe.config which is your configuration file. Open this in Notepad to see that the changes have in fact been saved.

 a120477322 июн. 2012 г., 04:50
Как я могу внести изменения тогда?
 10 мая 2016 г., 15:12
Для более надежного кода вы можете добавить тест, если ключ уже существует:if (configuration.AppSettings.Settings[key] == null) configuration.AppSettings.Settings.Add(key, value); else configuration.AppSettings.Settings[key].Value = value;
 22 июн. 2012 г., 04:54
На самом деле @Loclip,AppSettings[0] должен вернуть первый элемент в коллекции, в этом случае выlang запись.
 a120477322 июн. 2012 г., 04:53
System.Configuration.ConfigurationManager.AppSettings [0] ничего не будет делать в одиночку ... Пожалуйста, заполните код
 22 июн. 2012 г., 05:21
Нет, Кевин хотел, чтобы ты мог добавить это кWatch window во время выполнения, чтобы убедиться, что переменная имела ожидаемое вами значение.

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

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

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;

    }

Ваш ответ на вопрос