2009-06-11 17 views
23

Necesito actualizar una configuración en System.net SectionGroup de un archivo .Net exe app.config en tiempo de ejecución. No tengo acceso de escritura al archivo de configuración original en tiempo de ejecución (estoy desarrollando un complemento .Net dll alojado en un exe proporcionado por la aplicación que no tengo control) así que esperaba guardar una copia del archivo y reemplazar la configuración en el exe con la versión modificada en tiempo de ejecución. He intentado lo siguiente, pero no está funcionando. ¿Alguna sugerencia?Actualizar la configuración de app.config system.net en el tiempo de ejecución

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
    NetSectionGroup netSectionGroup = config.GetSectionGroup("system.net") as NetSectionGroup; 
    netSectionGroup.Settings.HttpWebRequest.UseUnsafeHeaderParsing = true;      
    config.SaveAs(@"C:\ProgramData\test.config", ConfigurationSaveMode.Full); 

    AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\ProgramData\test.config"); 

Respuesta

45

no habían entendido la pregunta si no tiene acceso al archivo app.config a causa de su propia implementación de diseño o simplemente no fueron capaces de guardar el archivo de configuración, por lo que aquí hay una pedazo de código que le permite modificar y guardar la sección appSettings en el archivo de configuración en tiempo de ejecución:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
KeyValueConfigurationCollection settings = config.AppSettings.Settings; 

// update SaveBeforeExit 
settings[-keyname-].Value = "newkeyvalue"; 
... 
//save the file 
config.Save(ConfigurationSaveMode.Modified); 
//relaod the section you modified 
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name); 

PS el código no va a salvar el archivo app.config que se ve en el editor de soluciones, lo hará pdate la "program_name archivo .exe.config "en la operación forlder.

+1

Estoy desarrollando un add-in para una aplicación .Net (Windows Media Center). El complemento toma la forma de un ensamblado dll .Net que se carga en un proceso de host independiente (ehexthost.exe) administrado por el Media Center exe (ehshell.exe). No puedo guardar en el archivo original app.config para el proceso de host debido a su ubicación, por lo tanto, la necesidad de guardar en la ruta alternativa. También quiero hacer un cambio en System.net SectionGroup no en AppSettings. Gracias. – mthornal

+0

Puedo confirmar que esto también funciona en .NET 4.0. (Gracias @AlexDrenea!) La clave (perdón por el juego de palabras) para mí era tener la configuración de esta manera: ' ' – AndrewJacksonZA

+1

Confirmado ... No se guardará en modo de depuración. Solo se guardará si ejecuta el archivo .exe en la carpeta bin. No vi ninguna evidencia de que se guarde en el archivo "program_name.exe.config". – bizah

2

con este código he cambiado la cadena de conexión en la configuración de la aplicación del archivo de configuración ... espero que esto pueda ser útil.

string ConStrng = ConfigurationSettings.AppSettings["ConnectionString"]; 
      string sss = "Data Source="; 
      string xxx = ";Initial Catalog=AlfalahScholarship;Integrated Security=True"; 
      //ConfigurationSettings.AppSetting; 
      System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
      //Get the appSettings section. 
      AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings"); 
      appSettings.Settings.Remove("ConnectionString"); 
      appSettings.Settings.Add("ConnectionString", sss + txtServerName.Text + xxx); 

      config.Save(ConfigurationSaveMode.Modified); 
      ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name); 
4

usando System.Configuration;

public void save_new_connection() 
    { 

     string ConStrng = ConfigurationManager.ConnectionStrings.ToString(); 
     ConnectionStringSettings conSetting = new ConnectionStringSettings(); 

     conSetting.ConnectionString="server=localho;UserId=root;password=mypass;database=night_anglecourier"; 
     conSetting.Name = "courier.Properties.Settings.night_anglecourierConnectionString"; 
     conSetting.ProviderName = "MySql.Data.MySqlClient"; 

     System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

     ConnectionStringsSection conSettings = (ConnectionStringsSection)config.GetSection("connectionStrings"); 
     conSettings.ConnectionStrings.Remove(conSetting); 
     conSettings.ConnectionStrings.Add(conSetting); 

     config.Save(ConfigurationSaveMode.Modified); 
     ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name); 


    } 
Cuestiones relacionadas