sec para examen electricista electricidad electricas cursos competencias certificacion c# setup-project appsettings

c# - para - ¿Cómo puedo configurar las aplicaciones en el momento de la instalación(a través de la clase de instalador)?



cursos sec (4)

Bueno, al final me rendí y tenía un tipo de método RunOnce para hacer estas cosas después de que se instaló la aplicación.

Tengo un proyecto de instalación de Visual Studio que tiene una clase de Instalador. En la clase de instalador, establecí una configuración de la siguiente manera:

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, aunque sé que este código se está ejecutando (estoy haciendo otras cosas), la configuración nunca se establece.

Los recuadros 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 alternativa?


Lo que hago para mis instaladores es usar el atributo "file" 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 atributo "archivo" es una especie de CSS, en el que la configuración más específica gana. 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 de appSettings en user.config (o como quieras 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, solo agregue 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 utilizamos para nuestros servidores de pruebas, capacitación y producción, por lo que todo lo que tenemos que hacer es especificar el nombre y la contraseña de la máquina durante la instalación, y todo se ha solucionado para nosotros. 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.


Honestamente, no sé si esto es compatible con un instalador, pero si lo es, asegúrese de estar llamando a Save() en Settings.Default .


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í.