Valor de alteração do App.Config

Este é o meu App.Config

      

Com esse código eu faço a mudança

 lang = "Russian"; private void Main_FormClosing(object sender, FormClosingEventArgs e) { System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang); } 

Mas isso não muda. O que estou fazendo errado?

Você não pode usar o object estático AppSettings para isso. Tente isso

 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 não mantém as alterações no seu arquivo de configuração. Apenas muda isso na memory. Se você colocar um ponto de interrupção em System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang); , e adicione um relógio para System.Configuration.ConfigurationManager.AppSettings[0] você verá a mudança de “Inglês” para “Russo” quando essa linha de código for executada.

O código a seguir (usado em um aplicativo de console) irá persistir a alteração.

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

A partir deste post: http://vbcity.com/forums/t/152772.aspx

Um ponto importante a ser observado com o acima é que, se você estiver executando isso a partir do depurador (dentro do Visual Studio), o arquivo app.config será sobrescrito sempre que você criar. A melhor maneira de testar isso é criar seu aplicativo e, em seguida, navegar até o diretório de saída e iniciar seu executável a partir dele. Dentro do diretório de saída, você também encontrará um arquivo chamado YourApplicationName.exe.config, que é o seu arquivo de configuração. Abra isto no bloco de notas para ver que as alterações foram de fato salvas.

Quando usar ” ConfigurationUserLevel.None “, seu código é executado corretamente quando você clica em nameyourapp.exe na pasta de debugging. .
mas quando você faz o desenvolvimento de app no ​​visual stdio não corre direito !! porque “vshost.exe” é executado.

parâmetro seguinte resolver este problema: ” Application.ExecutablePath

Tente isto: (testado no VS 2012 Express for Desktop)

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

meu inglês não é bom, me desculpe.

Isso funcionou para mim no aplicativo 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"); } 

Além da resposta de fenix2222 (que funcionou para mim) eu tive que modificar a última linha para:

 config.Save(ConfigurationSaveMode.Modified); 

Sem isso, o novo valor ainda estava sendo gravado no arquivo de configuração, mas o valor antigo foi recuperado durante a debugging.

Para um aplicativo de console .NET 4.0, nenhum deles funcionou para mim. Então eu modifiquei a resposta de Kevn Aenmey como abaixo e funcionou:

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

Somente a primeira linha é diferente, construída sobre o conjunto de execução real.

Obrigado Jahmic pela resposta. Trabalhou corretamente para mim.

outro snippet de código útil que lê os valores e retorna uma string:

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