2009-11-04 15 views
6

Tengo una aplicación con requisitos de configuración complejos. Estoy familiarizado con algunas de las herramientas que existen para crear programas de configuración como Wix, proyecto de instalación de Visual Studio, Inno-setup y herramientas de terceros. Para esta aplicación en particular, sin embargo, he determinado que necesito escribir el programa de instalación desde cero en C#, sin utilizar ninguna de esas herramientas. Algunos de los razonamientos expresados ​​por Joel se aplican aquí, excepto que quiero hacer esto en C# en lugar de MFC.¿Cómo crear un programa de instalación independiente y autónomo escrito en C#?

De todos modos, mi pregunta es: ¿cómo podría crear un ejecutable .NET que pueda contener un conjunto de archivos que se extraen en tiempo de ejecución? En este caso, el exe es el programa de instalación y los archivos son los archivos de programa que necesita instalar. Además, ¿cómo puedo hacer que el programa ejecutable sea completamente independiente, es decir, aunque estoy usando algunos ensambles externos (tanto los propios como los de terceros) quiero que estén empaquetados en un solo EXE (en C/C++ nativo este era realizado a través de enlaces estáticos).

ACTUALIZACIÓN

Este es el enfoque que he conseguido trabajar hasta el momento, que voy a seguir con menos que alguien sugiere algo mejor:

  • Creado un archivo de manifiesto en XML que contiene la lista de todos los archivos y la estructura de carpetas que comprende la aplicación que está instalando mi programa de instalación. Agregué este archivo al proyecto VS para el programa de instalación.
  • Escribió una herramienta en C# (zipfiles.exe) que toma el manifiesto XML y crea un archivo zip que contiene todos los archivos. Esta herramienta utiliza la increíble biblioteca DotNetZip para crear el archivo zip.
  • Agregué una acción de preconstrucción a mi proyecto de programa de instalación que inicia la herramienta de archivos zip con el manifiesto XML y genera el archivo zip (Files.zip) en la carpeta del proyecto.
  • Agregué Files.zip como recurso incrustado en mi proyecto de programa de instalación.
  • Mi programa de configuración en tiempo de ejecución extrae la cremallera incorporado y descomprime al objetivo de la carpeta de instalación de la aplicación (de nuevo usando DotNetZip)
  • añadido una acción posterior a la generación de mi proyecto de programa de instalación que utiliza la herramienta ILMerge para agrupar todos los ensamblajes externos que usa en el exe.

Ahora tengo un proyecto VS para mi programa de instalación que construye un exe autónomo con todos los archivos que necesita para instalar incrustado en él. Cuando cambia la lista de archivos para la aplicación que se está instalando, simplemente actualizo el XML del manifiesto y la reconstrucción.

¡Ahora puedo enfocarme en el resto de mi lógica de configuración!

+2

escribir 'cualquier cosa' en MFC es una locura! –

+2

Espera, solo porque Joel lo haya hecho no excluye la posibilidad de que sea una locura. Inició una compañía de software en Manhattan que no es también un banco de inversión. ¡Eso es una locura! – JasonTrue

+0

Bueno, esos fueron tiempos diferentes ... Estoy tratando de hacer lo mismo, excepto que use un lenguaje más moderno C# – DSO

Respuesta

0

La instalación puede no ser demasiado difícil (suponiendo que .NET Framework ya está instalado) pero también necesita considerar la reversión durante una instalación fallida y la desinstalación. Esta es la razón por la cual las instalaciones de MSI son tan complicadas. Necesitaría manejar esto usted mismo ...

+0

Sí, entiendo esto. No es difícil escribir un mecanismo simple de compromiso/retroceso. También estoy haciendo esto en .NET 2.0, que será un requisito previo mínimo para ejecutar la configuración. Mi primer problema es descubrir cómo agrupar todo (establecer archivos de programa, archivos de programa de aplicación y recursos) en un solo exe y manejar el registro en Agregar/Quitar programas correctamente para apuntar al exe. – DSO

0

WIX es el estándar para hacer MSI. Es algo complicado y frustrante aprender la OMI, pero vale la pena. Planea pasar un día para que funcione un instalador básico. Esta es la herramienta que utilizan Microsoft y muchas otras empresas.

+0

TS ya ha mencionado que utilizó WIX –

2

Puede usar Inno-Setup como contenedor principal para su instalador. Dentro de Inno-Setup puede ejecutar y esperar sus propias aplicaciones, que instalan o configuran partes específicas de la aplicación.

+0

Esto puede funcionar como una alternativa más flexible a iexpress ...usando la configuración inno como solo el paquete para desempaquetar e iniciar el programa de instalación. Investigaré más a fondo, gracias – DSO

1

Hicimos justamente eso para una aplicación que actualizamos semanalmente con nuevos datos.

Creamos dos aplicaciones. El primero fue utilizado para envolver la instalación. Esto consistió en reunir los archivos para distribuirlos y luego subirlos a un archivo comprimido zip. Usamos ChilkatZip para crear un archivo que se extrajera automáticamente y luego ejecutara la segunda aplicación que manejaba el proceso de instalación en la máquina cliente.

Sin embargo, nuestras necesidades eran bastante simples, pero nos permitieron eliminar una dependencia en Installshield que causaba algunos problemas de soporte internamente.

3

Simplemente cree un proyecto de instalación estándar de Visual Studio que contenga solo un custom install action.

Esto es en realidad un ensamblaje .NET dll estándar donde puede ejecutar cualquier código que necesite para instalar y desinstalar su aplicación.

Existe exactamente por los motivos que menciona, es decir, cuando su aplicación. requiere pasos de instalación y desinstalación más complejos que el instalador estándar.

+0

Esto solo te permite escribir acciones personalizadas de MSI en .NET. No le da control sobre todo el proceso de configuración (diálogos de IU, lógica de flujo de trabajo, etc.). – DSO

+2

En realidad, le otorga un control * completo * sobre el proceso de configuración. es decir, crea tus propios diálogos de UI de configuración, configura bases de datos SQL, escribe en el registro, instala/inicia servicios. Lo he usado yo mismo para configuraciones complejas. La configuración completa es solo una acción personalizada. De hecho, lo estás haciendo desde cero, pero dentro de las pautas de instalación de Windows, es decir, obtienes Agregar/Quitar programas, etc., de forma gratuita. – Ash

+0

Hmm .. no sabía que podía lanzar diálogos de IU en una acción personalizada. Pero sigue siendo una acción personalizada que se invoca en un momento determinado en la configuración del motor MSI. Usted no tiene control sobre lo que sucede antes o después. – DSO

2

Bueno, hay una razón por la que los sistemas de instalación como InnoSetup han estado en desarrollo activo durante años: escribir un instalador no es una tarea fácil. Usted dice que desea un control total sobre el proceso, que dice que puede lograr escribiendo el instalador desde cero.

Esto es cierto, por supuesto, pero no es una buena razón para escribir todo usted mismo - se puede también lograr esto mediante no escribir todo desde cero, pero mediante el uso de, por ejemplo, las capacidades de scripting de Inno Configuración para crear su propia interfaz de usuario y flujo de configuración, mientras sigue confiando en las funciones bien probadas de Inno Setup.

Creo que el tiempo que tendría que dedicar a crear un instalador desde cero sería invertirlo mejor en revisar los diversos sistemas existentes, evaluarlos sobre cuál proporciona el mejor soporte para todas las tareas de configuración requeridas y luego personalizándolo, para que el flujo de configuración se ajuste a sus necesidades.

+2

No quiero escribir toda mi lógica de configuración en un lenguaje de scripting que casi nadie conoce e incluso si lo aprendiera, lo olvidaré. Mi objetivo es hacer esto en C#, que cualquiera puede recoger y mantener, y que no olvidaré. – DSO

+1

Además, al escribir su lógica de configuración en C# obtiene mejores herramientas (VS), mejor capacidad de prueba. – DSO

0

¿Qué le parece usar SharpSetup? Le permite mezclar el código C# (incluida la GUI del instalador en WinForms), WiX (para crear una configuración básica como archivos, entradas de registro, accesos directos) y el código C++ (en caso de que .NET Framework aún no esté instalado). El proceso de compilación reúne todas esas partes juntas y usted termina con un instalador independiente de un solo archivo que se ejecuta en cualquier Windows moderno (W2K en adelante).

Descargo de responsabilidad: soy el autor de SharpSetup.

Cuestiones relacionadas