2009-04-24 24 views
5

¿Cómo puedo cambiar dinámicamente un connectionString en el archivo app.config?Cambiar app.config en el momento de la instalación

Tengo una aplicación escrita con formularios de Windows, C# 3.0 y Linq to Sql. Necesito cambiar la cadena de conexión cuando instalo la aplicación. ¿Cómo hago esto?

Cuando el usuario instala el programa, debe mostrar un formulario con la opción de cambiar la cadena de conexión si existe o agregar uno si no lo tiene.

Respuesta

0

Echa un vistazo this question. Tiene lo que necesita para cambiar los valores en la aplicación. Configúrelo dinámicamente a través del código.

+0

Estaba viendo una versión anterior de la pregunta. Utilizando el enlace que proporcioné, puede tener una pantalla emergente la primera vez que se inicia la aplicación para solicitar al usuario que cambie las cosas. –

5

Escriba un archivo de configuración secundaria con un bloque appSettings usando la configuración del instalador. En el archivo de configuración principal, utilice el atributo de archivo en appsettings para hacer referencia al segundo archivo de configuración, así:

<appSettings file="User.config"> 

ajustes en la configuración secundaria anulará cualquier clave que coinciden en la configuración principal.

En su instalador:

public override void Install(IDictionary stateSaver) 
{ 
    base.Install(stateSaver); 

    string server = Context.Parameters["Server"]; 
    string port = Context.Parameters["Port"]; 
    string targetDir = Context.Parameters["TargetDir"]; 
    // Build your connection string from user-input parameters and add them to dictionary 

    WriteAppConfig(targetDir, server, port); 
} 

private void WriteAppConfig(string targetDir, string server, string port) 
{ 
    string configFilePath = Path.Combine(targetDir, "User.config"); 

    IDictionary<string, string> userConfiguration = new Dictionary<string, string>(); 

    userConfiguration["Server"] = server; 
    userConfiguration["Port"] = port; 

    ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration); 
} 

public class ConfigGenerator 
{ 
    public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration) 
    { 
     using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8)) 
     { 
      xw.Formatting = Formatting.Indented; 
      xw.Indentation = 4; 
      xw.WriteStartDocument(); 
      xw.WriteStartElement("appSettings"); 

      foreach (KeyValuePair<string, string> pair in userConfiguration) 
      { 
       xw.WriteStartElement("add"); 
       xw.WriteAttributeString("key", pair.Key); 
       xw.WriteAttributeString("value", pair.Value); 
       xw.WriteEndElement(); 
      } 

      xw.WriteEndElement(); 
      xw.WriteEndDocument(); 
     } 
    } 
} 
+0

¡¡Creo que esta es la respuesta !! – Marshal

+0

¿Puede usted por favor me guía qué ruta de destino debe ser el dir? He incluido el archivo User.Config directamente en el proyecto, ¿no podemos simplemente escribir User.config sin combinarlo con la ruta de destino? Probé el código anterior ... pero no funcionaba. Sin embargo, tampoco dispara ningún error. – Marshal

+1

@Marshal: Lamento que no haya visto esto antes, pero si recuerdo correctamente, TargetDir es un parámetro establecido por el instalador de forma predeterminada, y debe establecerse en el directorio de instalación. Intente incluir algunas instrucciones de registro para ver qué es Context.Parameters ["TargetDir"] cuando intenta escribir el archivo de configuración. –

6

Si está utilizando un proyecto de implementación .NET, se puede lograr esto mediante el uso de acciones personalizadas.

+0

¿Debo escribir vbs en acciones personalizadas? Tengo que crear y almacenar el objeto de la clase de terceros en la configuración en el momento de la instalación – Heena

Cuestiones relacionadas