¡Muchas Gracias Fernando!
Carlos Marcelo Santos. From: [email protected] [mailto:[email protected]] On Behalf Of Fernando Tubio Sent: Jueves, 09 de Abril de 2009 12:23 p.m. To: [email protected] Subject: [puntonet] app.config Carlos, El problema es el uso del atributo file en lugar de configSource para indicar el nombre del archivo donde se encuentra la configuración alternativa. Cuando se usa este atributo, los valores de configuración devueltos son el resultado de la fusión de la sección appSettings del archivo principal y el archivo secundario. Si existe el valor solicitado en el archivo especificado por el atributo file, se devuelve ese valor, en caso contrario, se devuelve el valor del archivo principal. Cuando se modifica alguno de los valores de la sección y luego se salva, estimo que no debe ser fácil determinar la intención del desarrollador y en cuál de los dos archivos se pretende guardar cada una de las configuraciones, así que debe ser por eso que guarda todos los valores en el archivo principal. Se pueden modificar los valores y salvarlos sin modificar el archivo principal si se utiliza el atributo configSource. Pero en ese caso *todos* los valores tienen que estar definidos en el archivo secundario. Si utilizar configSource no es viable, entonces te sugiero crear una sección alternativa para los valores "localizados". Por ejemplo, --- App.config --- <configuration> <configSections> <section name="localizedAppSettings" type="System.Configuration.AppSettingsSection"/> </configSections> <!-- VALORES NO LOCALIZADOS --> <appSettings > <add key="item0" value="CERO"/> <add key="item2" value="DOS"/> </appSettings> <!-- VALORES LOCALIZADOS EN ARCHIVO SECUNDARIO --> <localizedAppSettings configSource="App.EN.config" /> </configuration> --- App.EN.config --- <localizedAppSettings> <add key="item1" value="ONE"/> <add key="item2" value="TWO"/> </localizedAppSettings> Para reproducir el comportamiento de fusión entre ambos archivos, se puede crear un método helper que recupere el valor de la sección localizedAppSettings y si allí no existe, entonces devolver el valor que encuentra en appSettings. Por ejemplo, usando un extension method sería: public static class AppSettingsHelper { public static KeyValueConfigurationElement GetLocalizedSetting(this Configuration config, string key) { AppSettingsSection section = (AppSettingsSection) config.GetSection("localizedAppSettings"); KeyValueConfigurationElement element = section.Settings[key]; if (element != null) return element; return config.AppSettings.Settings[key]; } } Y se podría usar de esta manera static void Main(string[] args) { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // devuelve CERO - [X] app.config, [ ] app.EN.config Console.WriteLine(config.GetLocalizedSetting("item0").Value); // devuelve ONE - [ ] app.config, [X] app.EN.config Console.WriteLine(config.GetLocalizedSetting("item1").Value); // devuelve TWO - [X] app.config, [X] app.EN.config Console.WriteLine(config.GetLocalizedSetting("item2").Value); // si se salva, los cambios afectan solo appSettings config.AppSettings.Settings["item2"].Value = "MODIFICADO"; config.Save(ConfigurationSaveMode.Modified); } Saludos, Fernando Tubio ----- Original Message ----- From: Carlos Marcelo Santos <mailto:[email protected]> To: [email protected] Sent: Monday, April 06, 2009 12:09 PM Subject: [puntonet] app.config Gracias por contestar José. Una aclaración, los valores de Terms.BR.config nunca los modifico desde la aplicación, sólo los del app.config. Así y todo me vuelca el Teerms.BR.config dentro del app.config Saludos. Carlos Marcelo Santos. From: [email protected] [mailto:[email protected]] On Behalf Of José A. Fernández Sent: Miércoles, 01 de Abril de 2009 08:29 a.m. To: [email protected] Subject: [puntonet] app.config Hola Carlos Utilizo esta tecnica de separar algunas secciones del web.config en archivos separados pero no los modifico desde la app, asi que no conocia de este comportamiento (que lo probare cuando tenga un tiempo, ya que debe ser algun parametro para la actualizacion del contenido en archivos separados) Lo que se me ocurre ahora es que debes abrir el archivo Terms.BR.config directamente y obtener la seccion appSettings y manipularla. No creo que la solucion sea como dice Daniel, porque si es un archivo separado del web.config en toda la aplicacion tendremos que hacer nuestra propia tecnica para leer los datos/obtener y en cambio si es <appSettings file= Terms.BR.config> de esta forma el ConfigurationManager lo tendremos siempre disponible sin necesidad de implementar nada (por esto me suena raro que para actualizar "copie" y debamos cambiar el modo de obtenerlo) Pero bueno la solucion "express" podria venir de la mano de algo asi: Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~/Terms.BR.config") Dim seccion As AppSettingsSection = CType(webConfig.GetSection("system.web/pages"), AppSettingsSection ) ...y alli manipulas el contenido y lo guardas. ...te puede ayudar este articulo: - Acceder a propiedades/atributos de secciones del web.config mediante codebehind http://geeks.ms/blogs/fernandezja/archive/2008/07/29/acceder-a-propiedades-a tributos-de-secciones-del-web-config-mediante-codebehind.aspx Espero que te sirva de ayuda o guia _______________________ Jose A. Fernandez blog: http://geeks.ms/blogs/fernandezja 2009/3/31 Carlos Marcelo Santos <[email protected]> Muchas Gracias Diego y Daniel. Carlos Marcelo Santos. From: [email protected] [mailto:[email protected]] On Behalf Of Daniel Calvin Sent: Martes, 31 de Marzo de 2009 11:45 a.m. To: [email protected] Subject: [puntonet] app.config Net ya trae clases para eso y podes hace implementaciones propias. Podes guardar tu propio archivo de conf. Carlos fijate como se maneja en coop el lazyload.config, usa esas clases y algunas propias. Pero todo lo hace con las apis de conf de net. Daniel El 31 de marzo de 2009 11:31, Diego Jancic <[email protected]> escribió: Hola Carlos, Nunca lo hice, pero imagino que es asi por diseño o por error... No pensaste directamente hacer un workarround guardando las configuracion en un XML tuyo? Es muy facil hacer una clase con las propiedades que queres y serializarlo a XML... Saludos! 2009/3/31 Carlos Marcelo Santos <[email protected]>: > Hola Gente: > > Disculpen que insista con el tema del mail que copio debajo, ¿alguien sabe > que puede estar sucediendo? > > > > Muchas Gracias. > > > > Carlos Marcelo Santos. > > > > From: [email protected] [mailto:[email protected]] On Behalf Of Carlos > Marcelo Santos > Sent: Jueves, 26 de Marzo de 2009 12:29 p.m. > To: [email protected] > Subject: [puntonet] app.config > > > > Hola Lista: > > Tengo una aplicación desktop en la que uso el app.config para almacenar > valores de configuración entre los tags <appSettings></appSettings> > > Como necesito implementar multilanguaje extiendo el archivo app.config > usando el tag <appSettings> de la siguiente forma: > > <appSettings file= Terms.BR.config> > > Y cambiando el atributo de file, con un archivo XML bien definido cambio de > lenguaje sin problemas. > > Hasta acá todo anda bien. > > Mi problema se da cuando desde la ejecución del programa cambio algún > parámetro, al persistirlo en el app.config con: > > > > Dim mAppConfig As System.Configuration. Configuration = > ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) > > mAppConfig.AppSettings.Item(ItemConfig).Value = NuevoValor > > mAppConfig.Save(ConfigurationSaveMode.Modified) > > > > Al ejecutar mAppConfig.Save me copia todo el contenido de Terms.BR.config > en el app.config > > ¿Conocen alguna forma de impedir que esta copia se produzca? > > > > Muchas Gracias. > > > > Carlos Marcelo Santos. > > > > Se certificó que el correo entrante no contiene virus. > Comprobada por AVG - www.avg.es > Versión: 8.5.278 / Base de datos de virus: 270.11.28/2022 - Fecha de la > versión: 03/25/09 18:54:00 -- Daniel A. Calvin Cooperator Team Member http://www.cooperator.com.ar Microsoft Certified Professional Se certificó que el correo entrante no contiene virus. Comprobada por AVG - www.avg.es Versión: 8.5.285 / Base de datos de virus: 270.11.32/2030 - Fecha de la versión: 03/31/09 06:02:00 Se certificó que el correo entrante no contiene virus. Comprobada por AVG - www.avg.es Versión: 8.5.285 / Base de datos de virus: 270.11.32/2030 - Fecha de la versión: 04/01/09 06:06:00 Se certificó que el correo entrante no contiene virus. Comprobada por AVG - www.avg.es Versión: 8.5.287 / Base de datos de virus: 270.11.32/2030 - Fecha de la versión: 04/09/09 10:27:00
