2010-09-03 14 views
13

Estoy buscando una manera de almacenar configuraciones de nivel de aplicación o máquina que se pueden escribir en tiempo de ejecución usando Application Settings. La configuración del usuario permite leer/escribir, pero la configuración de la aplicación no. He estado utilizando las configuraciones de usuario para guardar configuraciones como esta en el tiempo de ejecución, pero esto ha demostrado ser poco práctico por los siguientes motivos:¿Cómo puedo leer/escribir la configuración de app.config en tiempo de ejecución sin utilizar la configuración del usuario?

  • Todos los usuarios de la máquina necesitan compartir la configuración.
  • 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 utilizar la configuración anterior (la configuración del usuario parece que se ha desvanecido 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 son utilizadas por un usuario, por lo que generalmente no se necesitan configuraciones específicas del usuario.

De lo contrario, realmente me gusta utilizar la configuración de la aplicación y me gustaría seguir utilizándola si es posible. Sería ideal si la configuración pudiera residir en la misma carpeta que EXE (como en el caso de los buenos archivos'ini ').

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

+0

Almacenamiento de los ajustes de escritura en el mismo directorio que el ejecutable es una mala idea - en Vista/Win7, esto requiere escrituras de administración y voluntad activa el UAC y hace que tu aplicación se ejecute elevada. Es mejor guardar la configuración de la aplicación en otro lugar. – Andy

+0

@Andy Eso no me parece correcto. Escribí muchos programas que escriben en archivos xml en el mismo directorio que el EXE sin activar el UAC. –

Respuesta

9

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!

3

aplicaciones WPF son capaces de acceder al archivo app.config al igual que WinForms aplicaciones a través del método

ConfigurationManager.OpenExeConfiguration() 

. 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 de todo esto es para asegurarse de que llamar a los métodos siguientes cuando haya terminado la modificación de sus propiedades:

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

escribí un completo "cómo" en esto un poco tiempo atrás que lo explica todo here.

+0

Esto no funciona si el usuario no tiene los permisos de UAC correctos. – JWiley

+0

@JWiley Buen punto. Supongo que la otra suposición es que la aplicación está instalada en una ubicación donde se puede modificar este archivo. –

6

Este es el método que le permite cambiar las entradas de la <AppSettings>:

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 

Nota que he encontrado es necesario actualizar la sección de 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 true. El método para leer la configuración es trivial y que acabamos de mencionar está completo:

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

Nota que he rodeado por un tratar ... finalmente bloque para eliminar los errores. Si se produce algún error, GetSetting simplemente devuelve null mientras SetSetting devuelve falso. Eso hace más fácil su manejo, sin embargo si usted requiere las excepciones todavía puede añadir

 catch (Exception) { throw; } 

a emitir la excepción hasta la persona que llama. O, para la depuración se podría añadir:

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

que mostrará la excepción en el salida ventana de Visual Studio si se ha seleccionado la configuración "depuración", pero continuará con el código.


Nota (referencia cruzada a un tema similar):

  • El applicationSettings sección es diferente, ya que distingue entre "usuario" y "Aplicación" alcance y que soporta diferentes tipos de datos, no solo cadenas. Si desea saber cómo se puede manejar applicationSettings, se puede encontrar aquí (en stackoverflow):
    How to access applicationSettings

  • Si no está seguro si debe usar AppSettings o applicationSettings, entonces read this antes de decidir eso.

  • Si se encuentra con la advertencia 'ConfigurationSettings.AppSettings' is obsolete, entonces this hint can help you.

Cuestiones relacionadas