¿Cómo puedo leer / escribir configuraciones de app.config en tiempo de ejecución sin usar la configuración del usuario?

Estoy buscando una manera de almacenar la configuración de la aplicación o nivel de la máquina que se puede escribir en el tiempo de ejecución mediante la configuración de la aplicación . La configuración del usuario permite leer / escribir, pero la configuración de la aplicación no. He estado utilizando la configuración del usuario para guardar configuraciones como esta en el tiempo de ejecución, pero esto realmente ha demostrado ser poco práctico por las siguientes razones:

  • Todos los usuarios de la máquina necesitan compartir configuraciones.
  • En llamadas de soporte (especialmente en situaciones de crisis) es difícil explicar a los usuarios / empleados dónde encontrar y modificar estas configuraciones de forma manual (appdata es una carpeta oculta, entre otras cosas).
  • Las nuevas versiones de la aplicación necesitan usar configuraciones previas (la configuración del usuario parece que se desvanece con las nuevas versiones).
  • Es común que nuestros empleados copien la aplicación en una nueva carpeta que también restablece la configuración del usuario.

Las máquinas de nuestra empresa solo las usa un usuario, por lo que generalmente no se necesitan configuraciones específicas del usuario.

De lo contrario, me gusta usar la configuración de la aplicación y me gustaría seguir usándola si es posible. Sería ideal si la configuración pudiese residir en la misma carpeta que el EXE (como los buenos archivos ol ‘ini una vez).

NOTA: Esta es una aplicación WPF y no una aplicación web ASP.net, por lo que no hay web.config.

Bueno, todavía no he querido cambiar la configuración de la aplicación en tiempo de ejecución (para eso utilizo la configuración de usuario), pero lo que he podido hacer es escribir la configuración de la aplicación en el momento de la instalación. Imagino que un enfoque similar podría funcionar en tiempo de ejecución. Podrías probarlo ya que no parece haber otras soluciones propuestas ATM.

exePath = Path.Combine( exePath, "MyApp.exe" ); Configuration config = ConfigurationManager.OpenExeConfiguration( exePath ); var setting = config.AppSettings.Settings[SettingKey]; if (setting != null) { setting.Value = newValue; } else { config.AppSettings.Settings.Add( SettingKey, newValue); } config.Save(); 

¡Espero que ayude!

Este es el método que le permite cambiar las entradas en :

  internal static bool SetSetting(string Key, string Value) { bool result = false; try { System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.None); config.AppSettings.Settings.Remove(Key); var kvElem= new KeyValueConfigurationElement(Key, Value); config.AppSettings.Settings.Add(kvElem); // Save the configuration file. config.Save(ConfigurationSaveMode.Modified); // Force a reload of a changed section. ConfigurationManager.RefreshSection("appSettings"); result = true; } finally { } return result; } // function 

Tenga en cuenta que he encontrado que es necesario actualizar la sección appSettings después de la actualización.

La función elimina una clave antes de agregarla para evitar entradas dobles. Esto funciona también si la clave no existe previamente. Si hay algún error, devuelve falso , en caso de éxito verdadero . El método para leer configuraciones es trivial y solo se enumera para que esté completo:

  internal static string GetSetting(string Key) { string result = null; try { result = ConfigurationManager.AppSettings[Key]; } finally { } return result; } // function 

Tenga en cuenta que lo rodeé con un bash … finalmente bloquear para suprimir los errores. Si se produce algún error, GetSetting simplemente devuelve null mientras SetSetting devuelve falso. Eso facilita el manejo, sin embargo, si necesita las excepciones, aún puede agregar

  catch (Exception) { throw; } 

lanzar la excepción a la persona que llama. O bien, para la depuración, puede agregar:

  #if DEBUG catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } #endif 

Que mostrará la excepción en la ventana de resultados de Visual Studio si seleccionó la configuración “Depurar”, pero continuará con el código.


Nota (referencia cruzada a un tema similar):

  • La sección de configuración de la aplicación es diferente, ya que distingue entre el ámbito “Usuario” y “Aplicación” y admite diferentes tipos de datos, no solo cadenas. Si desea saber cómo puede manejar las configuraciones de la aplicación , puede encontrarla aquí (en stackoverflow):
    Cómo acceder a ApplicationSettings

  • Si no está seguro de si debe usar AppSettings o AppSettings , lea esto antes de decidirlo.

  • Si encuentra la advertencia 'ConfigurationSettings.AppSettings' is obsolete , esta sugerencia puede ayudarlo.

Las aplicaciones WPF pueden acceder al archivo app.config al igual que las aplicaciones WinForms a través del

 ConfigurationManager.OpenExeConfiguration() 

método. El truco es tener los valores a los que desea acceder en la etiqueta AppSettings de su archivo App.config (también disponible en las aplicaciones WPF).

El truco para todo esto es asegurarse de llamar a los siguientes métodos cuando termine de modificar sus propiedades:

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

Escribí un “cómo hacer” completo sobre esto hace un tiempo que lo explica todo aquí .