Подтвердить что ты не робот

Значение изменения 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);
}

Но это не изменится. Что я делаю неправильно?

4b9b3361

Ответ 1

Для этого нельзя использовать статический объект 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(); 

Ответ 2

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, который является вашим файлом конфигурации. Откройте это в Блокноте, чтобы увидеть, что изменения действительно сохранены.

Ответ 3

когда вы используете " 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);

мой английский не очень хороший, извините.

Ответ 4

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

string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();

Ответ 5

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

Ответ 6

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

config.Save(ConfigurationSaveMode.Modified);

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

Ответ 7

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

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

Ответ 8

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

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

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;

    }

Ответ 9

Чтобы обновить записи, отличные от appsettings, просто используйте XmlDocument.

public static void UpdateAppConfig(string tagName, string attributeName, string value)
{
    var doc = new XmlDocument();
    doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    var tags = doc.GetElementsByTagName(tagName);
    foreach (XmlNode item in tags)
    {
        var attribute = item.Attributes[attributeName];
        if (!ReferenceEquals(null, attribute))
            attribute.Value = value;
    }
    doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
}

Вот как вы это называете:

Utility.UpdateAppConfig("endpoint", "address", "http://localhost:19092/NotificationSvc/Notification.svc");

Utility.UpdateAppConfig("network", "host", "abc.com.au");

Этот метод может быть улучшен для обработки значений appSettings.