2009-02-07 9 views
6

Tengo un proyecto de instalación de Visual Studio que tiene una clase de Instalador. En la clase de instalación puse un ajuste de la siguiente manera:¿Cómo puedo establecer la configuración de la aplicación en el momento de la instalación (a través de la clase de instalador)

 MessageBox.Show(Properties.Settings.Default.MySetting); 

     Properties.Settings.Default.MySetting = "Foo"; 
     Properties.Settings.Default.Save(); 

     MessageBox.Show(Properties.Settings.Default.MySetting); 

El problema es que a pesar de que sé que se está ejecutando el código (que estoy haciendo otras cosas), el ajuste no se establece nunca !!

Los cuadros de mensaje sugieren que se está estableciendo el valor, pero cuando voy al archivo .config, ¡el valor aún está en blanco!

¿Alguien tiene alguna idea de por qué y/o una posible solución?

Respuesta

4

Lo que hago para mis instaladores es utilizar el atributo "archivo" en App.Config. El bloque appsettings toma un atributo de "archivo", así:

<appSettings file="user.config"> 
    <add key="foo" value="some value unchanged by setup"/> 
</appSettings> 

El "archivo" atributo es algo así como CSS, en el que gana el ajuste más específicos. Si tiene definido "foo" en user.config y App.config, se utiliza el valor en user.config.

Luego, tengo un generador de configuraciones que escribe un segundo bloque appSettings en user.config (o como quiera llamarlo), usando valores en un diccionario.

using System.Collections.Generic; 
using System.Text; 
using System.Xml; 

namespace Utils 
{ 
    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(); 
      } 
     } 
    } 
} 

En su instalador, sólo tiene que añadir algo como lo siguiente en su método de instalación:

string configFilePath = string.Format("{0}{1}User.config", targetDir, Path.DirectorySeparatorChar); 

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

userConfiguration["Server"] = Context.Parameters["Server"]; 
userConfiguration["Port"] = Context.Parameters["Port"]; 

ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration); 

Lo usamos para nuestras pruebas, la formación y los servidores de producción, por lo que todo lo que tenemos que hacer es especificar el nombre de la máquina y la contraseña durante la instalación, y todo está a nuestro cuidado. Solía ​​ser un proceso de 3 horas, que incluía varios archivos de configuración para configurar contraseñas. Ahora está casi completamente automatizado.

Espero que esto ayude.

+0

Gracias por esto, parece el tipo de solución que estoy buscando. Aunque me tocó un problema, si anulo el método de instalación en mi instalador, los valores de la interfaz de usuario personalizada no están en los parámetros de contexto. ¿Estoy usando el método correcto? Cheers – MrEdmundo

+0

Ignore eso, no había pasado los datos de la interfaz de usuario en la pantalla de edición de CustomActions. – MrEdmundo

0

Honestamente, no sé si esto es compatible con un instalador, pero si es así, asegúrese de llamar al Save() en Settings.Default.

+0

He establecido la configuración Guardar, pero a pesar de esto, ¡realmente no se está configurando el valor! – Calanus

0

Bueno, al final me rendí y tenía un método tipo RunOnce para hacer esto después de instalar la aplicación.

0

La respuesta corta es que no es compatible con las clases de instalador. Solo necesita comprender que los métodos de clase de instalador se invocan desde msiexec.exe que se ejecuta desde el directorio del sistema, y ​​ese entorno posiblemente no puede saber que tiene un archivo de configuración en algún lugar de un directorio que desconoce por completo. Es por eso que funciona con un código que va explícitamente a la ubicación instalada del archivo y lo actualiza allí.

Cuestiones relacionadas