2010-04-30 10 views
5

Tengo una solución .NET con un proyecto de instalador que genera un MSI. Uno de los proyectos instalados por el MSI contiene un archivo App.Config. Parece que los valores de ese archivo de configuración están incrustados en el MSI en tiempo de compilación. ¿Hay alguna manera de anularlos en el tiempo de ejecución?¿Reemplaza las configuraciones de app.config incrustadas en una MSI?

Por ejemplo, la App.Config con la que estoy trabajando establece la URL de un servicio web con el que el instalador se comunica. ¿Es posible anular esta URL en tiempo de ejecución, para que no tenga que volver a compilar la MSI si la URL cambia?

Actualización: Creo que lo que estoy preguntando es, ¿puedo copiar un archivo app.config, con un cierto nombre, en mi directorio de instalación de tal manera que se anulará, en tiempo de ejecución, los ajustes incorporados en el MSI ?

Sé que puedo rediseñar el código para comprobar si hay sustituciones en otros lugares, como el registro o una ubicación de archivo de texto conocida, pero mi necesidad inmediata es resolver este problema sin una recompilación. (Hay muchos discos de instalación en manos de los usuarios)

Respuesta

1

Tuvimos un desafío similar al desarrollar la aplicación en la que estoy trabajando actualmente. Queríamos poder iniciar una nueva instalación la primera vez preconfigurada con configuraciones transferidas desde otra máquina, o una utilidad de configuración. Honestamente, no sé cuán buena es nuestra solución en el gran plan, pero puedo decirles lo que hicimos, lo cual está funcionando para nosotros, por ahora.

En nuestro caso, muchas de estas configuraciones terminan en el archivo app.config, que no se recomienda tratar y manipular desde fuera de la aplicación. Se puede hacer, pero es peligroso de varias maneras sutiles. Si este no fuera el caso, la mejor opción sería agregar una "acción personalizada" para el proyecto de configuración que inyectaría los datos en el archivo, la base de datos o lo que estuviéramos utilizando para almacenar nuestra configuración. Se puede encontrar un punto de partida para saber cómo hacerlo in MSDN.

Pero como no era una opción, decidimos que probablemente la forma más sencilla de obtener datos a través de la instalación de la aplicación, sin incluirlo en el paquete de instalación, sería usar un archivo "de acompañamiento". Este es un archivo que su instalación conoce, pero que no está integrado en .MSI. Simplemente debe estar en una ubicación conocida relativa al .MSI cuando realiza la instalación. Le dice al proyecto de instalación qué es ese archivo, dónde debería estar y dónde colocarlo. Luego, su aplicación puede verificar su existencia al inicio y procesar lo que encuentre allí. En su caso, esto sería una anulación de configuración de URL. Luego, la aplicación puede eliminar el archivo, por lo que no se carga cada vez que se inicia.

En el proyecto de instalación, el archivo deberá tener algunas propiedades establecidas para garantizar que funcione correctamente con el estilo de paquete que produce un proyecto de configuración de VS.Asegúrese de configurarlos, o podría obtener errores u otras conductas extrañas cuando se excluya el archivo de transporte porque no es necesario.

  • Estado: No vuelva a instalar
  • PacakgeAs: vsdpaLoose
  • Vital: Falso

que llamamos nuestro AutoImport.Settings.xml archivo. Este es un archivo XML personalizado que almacena todos los datos con los que queremos poder inicializar nuestra aplicación cuando está instalada. Sigue el mismo formato que usamos cuando exportamos/importamos configuraciones desde la aplicación en tiempo de ejecución, y usamos el mismo mecanismo. Simplemente lo hace automáticamente en la puesta en marcha, si encuentra el archivo allí. Esto nos permite configurar una máquina "prototipo" con todas las configuraciones específicas de red que queremos que tenga, exportar esas configuraciones y luego enviar ese archivo de importación para la carga automática con cualquier otra instalación que hagamos en ese entorno de red.

Como dije, parece que debería haber una "mejor" manera. Los únicos que se nos ocurrió fueron apartarse de los mecanismos app.config y user.config, que tienen sus ventajas. Así que al final decidimos que esta era la alternativa de menor fricción que respondía a nuestras necesidades.

+0

Gracias por las sugerencias. Esta aplicación se instala a través de un CD, por lo que agregar o modificar el archivo puede ser difícil, así que creo que una mejor opción para mis necesidades sería modificar el código de instalación para verificar una clave de registro conocida para un valor predeterminado. Mi objetivo principal era averiguar si el MSI buscaría automáticamente un archivo de un determinado nombre de archivo y parece que estás diciendo "no, tienes que rodar eso tú mismo". No es la respuesta que quería, pero una respuesta no obstante :) –

0

Si necesita que el instalador hable con un servicio web, ¿dónde va a guardar la URL, si no está en el instalador?

Si tiene un lugar conocido donde buscar la URL (una URL "constante", base de datos, recurso compartido de archivos, etc.), podría incluir su dirección en el instalador. De lo contrario, simplemente no hay lugar para obtener la URL de ...

0

Si expone la url como propiedad pública (es decir, cualquier propiedad de la tabla Proeprties que se encuentre en mayúsculas se considera pública, no sé si tiene este nivel de control en un proyecto de instalador en VS), luego puede configurarlo desde la línea de comando cuando ejecuta el MSI. Aunque esta no es una buena solución a largo plazo para su problema en particular, tal vez una mejor idea es hacer una conexión inicial a una dirección conocida que no va a cambiar, y puede devolver la dirección actual del servicio web real que desea hablar con.

+0

La URL en cuestión _es_ la "dirección conocida que no va a cambiar", es de donde el instalador descarga otros datos de configuración. El problema es que esta URL sí cambió después de todo :) –

+0

Entonces podría estar en el punto en el que tiene que morder la bala, y reconstruir la MSI (suponiendo que es imposible hacer ningún tipo de redirección automática en el servidor de alojamiento de el servicio web original). – slugster

Cuestiones relacionadas