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 
  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-atributos-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

Responder a