Вопрос по c#, app-config – App.Config изменить значение

39

Это мой 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);
}

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

Также см:stackoverflow.com/questions/5274829/… Grant
возможный дубликатWrite values in app.config file nawfal

Ваш Ответ

8   ответов
44

Для этого нельзя использовать статический объект 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 ... Нет исключений ... a1204773
Вы получаете какие-либо исключения? Вы используете WinForms?
Выдает NullReferenceException при установке значения. config.AppSettings.Settings count равен нулю, хотя у меня есть ключ в моих appSettings. Я на C # 4.5
Но он перезапускается ... Я делаю изменения при закрытии формы ... При повторном запуске программы ничего не меняется a1204773
В моем .Net (4.5) с Visual Studio 2013 Ultimate у меня может быть System.Configuration, но нет такого объекта, как System.Configuration.Configuration.
2

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

config.Save(ConfigurationSaveMode.Modified);

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

10

при использовании & 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.

87

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.

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

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

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

2
    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");
    }
Вы также можете объединить сApplication.ExecutablePath вариант для звонкаOpenExeConfiguration, как упомянуто в ответе @Amin Ghaderi
Вы можете не захотеть сохранять конфигурацию в ConfigurationSaveMode.Full. Это добавит в файл app.config кучу вещей, которые вам не нужны. Остальное хорошо.
6

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

string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();
Ваш код также работал для меня. Спасибо!
@ jned29, не стесняйтесь высказать свой ответ, если он поможет вам :).
1

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

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

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;

    }

Похожие вопросы