2011-04-22 27 views
7

Tengo el siguiente problema: estoy introduciendo una nueva característica en la aplicación (ejecutada como servicio de Windows) y me gustaría tener esa nueva característica controlada (activar/desactivar) usando algún tipo de archivo de configuración entrada (myKey). Puedo almacenar la entrada de configuración en app.config, pero si quiero cambiarlo de on-> off o de lo contrario, requerirá reiniciar el servicio de Windows, y quiero evitarlo. Quiero que mi aplicación se ejecute y recoger los cambios en la configuración.Cambio en la configuración de la aplicación sin reinicio de la aplicación

La pregunta es: ¿existe un mecanismo de compilación en .NET que resuelva ese problema? Supongo que podría crear mi propio archivo de configuración, luego usar FileSystemWatcher etc ... ¿Pero quizás .NET permite usar archivos de configuración externos y volverá a cargar el valor?

ConfigurationManager.AppSettings["myKey"] 

Gracias, Pawel

EDIT 1: Gracias por las respuestas. Sin embargo escribí siguiente fragmento y no funciona (He intentado crear appSettingSection en ambos lugares: antes y en el interior circular):

static void Main(string[] args) 
{ 
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
    // AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings"); 
    for (int i = 0; i < 10; i++) 
    { 
     ConfigurationManager.RefreshSection("appSettings"); 
     AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings"); 
     string myConfigData = appSettingSection.Settings["myConfigData"].Value; // still the same value, doesn't get updated 
     Console.WriteLine(); 
     Console.WriteLine("Using GetSection(string)."); 
     Console.WriteLine("AppSettings section:"); 
     Console.WriteLine(
      appSettingSection.SectionInformation.GetRawXml()); // also XML is still the same 
     Console.ReadLine(); 
    } 
} 

puedo editar manualmente el archivo de configuración cuando la aplicación se detiene en Console.ReadLine().

Respuesta

7

Una vez que se carga el archivo original app.config, sus valores se guardan en la memoria caché para que usted sepa que debe reiniciar la aplicación. La forma de evitar esto es crear un nuevo objeto de configuración y leer las claves manualmente así:

var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location); 
string myConfigData = appConfig.AppSettings.Settings["myConfigData"].Value; 
+0

Gracias! Pero aún así: de esa forma, cada vez que accedo a myConfigData tendría que crear un nuevo objeto de configuración para asegurarme de que appConfig.AppSettings.Settings ["myConfigData"]. Value sea coherente con el valor subyacente en el archivo app.config? – dragonfly

+11

Simplemente llame a 'ConfigurationManager.RefreshSection (" appSettings ");' antes de llamar a 'appConfig.AppSettings.Settings [" myConfigData "]. Value;' lo que obligará a la aplicación a leer las configuraciones nuevas y modificadas. De lo contrario, 'ConfigurationManager' inherentemente guarda en caché todos los valores. –

+1

@TeomanSoygul 'RefreshSection'call actualiza el valor recuperado a través de' ConfigurationManager.AppSettings [] 'no afecta a una instancia de configuración. – SerG

1

Si se procesa la configuración manualmente (tal vez ni siquiera en el archivo app.config), entonces usted puede comprobar periódicamente que archivo para actualizaciones.

FileSystemWatcher es ... probablemente exagerado, y no se garantiza en todos los escenarios. Personalmente, simplemente sondeé el archivo cada (digamos) 30 segundos.

+0

Hola, ¿te refieres a la agrupación usando la solución descrita por @Teoman Soygul? Creo que volver a cargar esa configuración cada 1 minuto satisfaría mis necesidades. – dragonfly

+0

@dragonfly bien, más o menos; aunque no necesariamente use la ruta de configuración de la aplicación para ello. Sin embargo, cualquier ruta funcionará; esto no necesita ser complejo. –

Cuestiones relacionadas