ConfigurationManager не сохраняет настройки - PullRequest
15 голосов
/ 18 ноября 2010

Вот код, который я использую:

private void SaveConfiguration()
{
    if (txtUsername.Text != "" && txtPassword.Text != "")
    {
        ConfigurationManager.AppSettings["Username"] = txtUsername.Text;
        ConfigurationManager.AppSettings["Password"] = txtPassword.Text;

        MessageBox.Show("Su configuracion guardo exitosamente.", "Exito!");
        this.Close();
    }
    else
    {
        MessageBox.Show("Por favor lleno los campos.", "Error.");
    }
}

Теперь настройки сохраняются, но когда я закрываю приложение и нажимаю клавишу F5, чтобы запустить его снова, значения возвращаются к тому, что введено в файл app.config. Есть предложения?

Ответы [ 3 ]

51 голосов
/ 18 ноября 2010

Я думаю, вам следует вызвать метод Save

ConfigurationManager.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

EDIT

Для сохранения необходимо использовать объект конфигурации, возвращенный методом OpenExeConfiguration

//Create the object
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

//make changes
config.AppSettings.Settings["Username"].Value = txtUsername.Text;
config.AppSettings.Settings["Password"].Value = txtPassword.Text;

//save to apply changes
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

Дополнительные ссылки здесь Класс ConfigurationManager

31 голосов
/ 18 ноября 2010

Когда вы запускаете приложение с F5,

  • ваш код компилируется,
  • исполняемый файл копируется в подкаталог bin или bin\Debug вашего каталога исходного кода,
  • ваш app.config копируется как yourexecutable.exe.config в этот каталог, а
  • ваш исполняемый файл запускается в этом каталоге.

Таким образом, ваше приложение используетyourexecutable.exe.config в каталоге bin или bin\Debug, и там , что ConfigurationManager сохраняет изменения, а не в каталоге исходного кода.Это не будет проблемой после развертывания вашего приложения, потому что тогда изменения перейдут на yourexecutable.exe.config в каталоге развертывания, что вам и нужно.

0 голосов
/ 20 октября 2017

В дополнение к комментарию Аптере по второму ответу:

Также обратите внимание, что если вы отлаживаете (и не отключили процесс vshost), то когда ваше приложение останавливается, yourexecutable.vshost.exe.configбудет заменен на yourexecutable.exe.config.

Так что, опять же, вы можете не увидеть никаких изменений, которые вы внесли позже!(Если вы остановитесь на точке останова во время отладки и посмотрите файл после внесения изменений и вызова раздела обновления, вы увидите ваши изменения).

Это очень сбивает с толку, если вы отлаживаете программу, которая ищет параметр и, если его нет, записывает его.Даже если вы предупреждены о том, что параметр будет присутствовать при втором запуске программы, можно ожидать, что он будет там ПОСЛЕ первого запуска программы и ДО второго запуска ... увы!

Не о чем беспокоиться, так как все это работает, когда приложение развертывается или запускается непосредственно из bin, как уже заявили другие ...

Но возможно попасть в ловушку, если выповторно отладьте вашу программу и решите использовать Настройки приложения в первый раз, и чтобы избежать написания от руки XML-кода, вы решите, что начнете с кода и попросите программу написать настройку ... чтобы получить все эти вещи, а затем, возможно,добавить еще несколько.

...