lunes, 20 de octubre de 2008

Proyectos de instalación con Visual Studio

En el mundo de desarrollo de software empresarial, los instaladores son una pieza de software a la que, por norma general, no se le da la importancia necesaria. De hecho suele ser en lo último en lo que piensa un equipo de desarrollo cuando se empieza un nuevo proyecto, cosa paradójica (y peligrosa) ya que la instalación es la primera toma de contacto que el cliente tiene con el nuevo sistema.

Además hay que tener en cuenta que en los tiempos que corren la mayoría de usuarios a los que va a ir destinado nuestro sistema es gente más o menos familiarizada con los ordenadores y con el software (todo el mundo tiene PC en casa, móviles de última generación, etc.) y un proceso de instalación que sea sencillo y visible aportará confianza y un mayor grado de implicación del usuario en la adopción del nuevo sistema.

Si por el contrario el proceso de instalación es oscuro, difícil y complicado, con multitud de ficheros de configuración ininteligibles y que prácticamente es necesario un master para llevarlo a cabo, los usuarios finales percibirán que están tratando con algo complicado y el rechazo a la implantación del nuevo sistema será mayor.

Todo este rollo de introducción viene a cuento para explicar como realizar instaladores de manera sencilla con Visual Studio. Algo que a mucha gente le parece complicado y tedioso, pero que realmente ,para instaladores no excesivamente complejos, es un proceso bastante simple.

Visual Studio tiene un tipo de proyecto que sirve para este propósito, proyectos llamados Setup Projects (o Proyectos de Instalación en la edición en castellano). Este tipo de proyectos permiten crear diferentes paquetes de instalación para Windows, entre ellos los comúnmente conocidos msi. Para crear un nuevo proyecto de este tipo hay que ir al menú File -> New -> Project y seleccionar el tipo de proyecto Setup Project


Aparecerá una pantalla similar a esta:


En ella podemos distinguir varias zonas:

1) En esta zona de la pantalla aparecen los menús y paneles relativos a la opción del instalador que estemos editando en ese momento. En este caso la opción seleccionada (la que aparece al crear el proyecto) es el sistema de archivos (File System)

2) Barra de herramientas de la pestaña Solution Explorer. En esta barra de herramientas aparecen las diferentes opciones que tenemos para el instalador (por ejemplo el Sistema de Archivos, el editor del Registro, etc.) Hay que tener en cuenta que esta barra irá cambiando según el elemento que tengamos seleccionado en la zona 3 (Solution Explorer). Para visualizar las diferentes opciones del instalador en la barra hay que seleccionar el elemento que representa el proyecto (en nuestro caso SetupExampleProject)

3) Solution Explorer. Representa los elementos que se van añadiendo al proyecto en forma de árbol.

Ahora explicaré las diferentes opciones que Visual Studio nos permite configurar para un proyecto de instalación.

File System Editor

La primera opción que tenemos para personalizar nuestro instalador es el editor del sistema de archivos.



Esta pantalla nos permite crear la estructura de carpetas (lógica) que nuestro instalador creará y utilizará en la máquina de destino y nos permite definir que archivos o componentes contendrán cada una de estas carpetas. Esta estructura se representa en el árbol etiquetado cómo File System on Target Machine en el panel de mas a la izquierda.

Por defecto la estructura cuenta con 3 carpetas, Application Folder, que representa la carpeta donde se instalará la aplicación, User’s Desktop, que representa el escritorio del usuario de la máquina de destino y User’s Program Menú, que representa el menú Programas del usuario. Estas carpetas son representaciones lógicas del sistema de archivos de la máquina destino, y hasta el momento de la instalación no se mapearán a unidades concretas (aunque hay excepciones).

Aparte de las carpetas por defecto se pueden añadir mas carpetas a la estructura, ya sean subcarpetas (por ejemplo subdirectorios de la carpeta de la aplicación) u otros directorios especiales del sistema (por ejemplo la carpeta System32)

Nuevas carpetas añadidas a la estructura de destino


El proceso de añadir una carpeta es tan simple cómo botón derecho sobre la carpeta padre (o la raíz si queremos añadir una carpeta especial) y escoger la opción deseada (la carpeta especial o el nombre de la nueva carpeta según queramos)

Añadiendo una carpeta del SO a nuestro instalador


Una vez creada la estructura es hora de añadir ficheros, ensamblados o accesos directos a nuestro instalador.

El proceso de añadir ficheros o ensamblados es tan simple cómo arrastrarlos a la carpeta deseada (se consigue lo mismo mediante el menú contextual del directorio escogido)

Por ejemplo vamos a añadir a la carpeta de nuestra aplicación un ejecutable para una sencilla aplicación Windows.

Añadimos el exe a la carpeta ApplicationFolder


Añadimos las imágenes a la carpeta de Imágenes creada anteriormente


Ahora podemos crear un acceso directo a nuestra aplicación. Para ello hay que seleccionar el exe que acabamos de añadir y marcamos la opción del menú contextual Create Shortcut to WindowsFormApplication1

Esto nos creará en la misma carpeta un fichero con el nombre Shortcut to WindowsFormApplication1. Podemos cambiarle el nombre por el que queramos, por ejemplo VisorImagenes y lo arrastramos al directorio de la estructura que nos interese. Por ejemplo al Escritorio.


De él acceso directo podemos configurar varias propiedades. Para acceder a la pantalla de propiedades del acceso directo pulsamos Properties en el menú contextual del mismo. La pantalla de propiedades del acceso directo muestra lo siguiente:



Entre otras cosas puede configurarse el icono del acceso directo, los argumentos que se le pasan al ejecutable por línea de comandos, etc.

De la misma manera se pueden configurar distintas propiedades para las carpetas y los archivos.

Por ejemplo, por defecto las carpetas que no son de sistema no se crean en la màquina de destino si están vacias, para evitar esto y forzar a que siempre se creen hay que poner el valor de la propiedad AlwaysCreate de la carpeta en cuestión a True.

La pantalla de propiedades del fichero ejecutable muestra las siguientes propiedades:




Entre otras opciones se puede configurar si se debe registrar el fichero, si es permanente (no se borra al desinstalar la aplicación),etc.

Propiedades de AppFolder

La carpeta de la aplicación tiene una serie de propiedades que vale la pena reseñar:

DefaultLocation : Se muestra la ruta donde se creará la carpeta del instalador. Esta ruta tiene la siguiente forma al inicio-> [ProgramFilesFolder][Manufacturer]\[ProductName]

ProgramFilesFolder indica la carpeta da Archivos de Programa, que puede cambiar de ubicación según el equipo, el sistema operativo, etc.

Manufacturer y ProductName son propiedades genéricas de WindowsInstaller que se pueden definir en las propiedades del proyecto.

Pantalla de propiedades del proyecto


Entre estas propiedades hay muchas importantes para el proceso de instalación, entre ellas las de ProductCode, Upgrade Code o RemovePreviousVersion que se utilizan para actualizar versiones antiguas de la aplicación (podéis encontrar una explicación más detallada aquí -> http://www.simple-talk.com/dotnet/visual-studio/updates-to-setup-projects/ )

Registro de ficheros COM

Visual Studio permite registrar ficheros COM en el proceso de instalación. Las opciones que proporciona el IDE para registrar estas librerías varían en función de su tipo, objeto COM tradicional o Dll .Net exponiendo interfaces y clases COM.



  • Objetos COM tradicionales

Un objeto COM tendrá las siguientes opciones de registro:

    • vsdrfCOMSelfReg : Auto registro. Windows Installer llama a RegSvr32 en el momento de la instalación. No es la opción recomendada.
    • vsdrfCOM: Los datos de registro se crean en el momento de la instalación pero el código de la dll no es llamado en ese punto. Esto asegura que no haya fallos en situaciones donde la dll está linkada a otra dll que todavía no se ha registrado.
    • vsdrfCOMRelativePath: El mismo tipo de registro que el anterior pero en esta opción el Path del objeto es relativo, no absoluto. Se usa en variedades muy específicas de instalaciones.

  • DLL’s .NET

Este tipo de ficheros tienen 2 opciones de registro que corresponden con las dos últimas del punto anterior. Las diferencias entre un tipo y otro se basan básicamente en que los objetos COM tienen la información de registro en la propia dll mientras que las librerías .Net no contienen información del tipo de datos COM. El instalador usa para esto la herramienta tlbExp.exe que genera la información de registro asociada a la librería .Net.

Jugando con las diferentes ideas expuestas anteriormente se puede configurar completamente la estructura de directorios y ficheros que utilizará nuestro instalador.


Registry Editor


Esta sección del instalador permite crear editar o borrar entradas en el registro de Windows. Por ejemplo si queremos crear una entrada en el registro con la localización donde hemos instalado la aplicación, tenemos que ir a la rama del registro deseada y allí crear una nueva clave.


Creando una nueva clave en el registro


Como se ve en la imagen vamos a crear una clave en el registro en la entrada correspondiente a HKEY_CURRENT_USER -> Software -> [Manufacturer]. Este Manufacturer corresponde a la misma propiedad que comentamos brevemente que se puede modificar en las propiedades del proyecto.

Finalmente la el editor de registro quedaria así:



Vemos que hemos añadido una carpeta más a la ruta del registro ([ProductName]) y que después hemos añadido una clave (haciendo botón derecho en el carpeta donde se quiere añadir la clave aparece un menú contextual) a la que le hemos dado el nombre de Location y el valor [TARGETDIR]. Este valor es de nuevo una propiedad del proyecto, que como vemos se pueden utilizar en diferentes sitios del instalador para no tener que establecer los valores en tiempo de compilación. De todas formas también se podía haber optado por colocar una cadena de texto fija (por ejemplo si tuviéramos una ruta de instalación fija y conocida de antemano).

File Types Editor

La sección de Tipos de Archivo permite asociar tipos de archivo a nuestra aplicación. Por ejemplo si nuestra aplicación utiliza unos archivos con extensión “.jkp” podemos definir que se abra automáticamente nuestra aplicación al abrir uno de estos ficheros. No entraremos más en detalle al estar fuera de las funcionalidades más básicas de un instalador.

User Interface Editor


En esta sección se pueden definir las diferentes pantallas de las que constara el instalador. Por ejemplo si habrá una pantalla de bienvenida, de información de licencia al usuario, la de finalización de la instalación, etc.

Hay un número suficiente de formularios de usuario y tiene algunas opciones para personalizarlos, cómo cambiar el banner por defecto, aunque aún está bastante lejos del nivel de personalización de aplicaciones de terceros.

La pantalla muestra dos árboles diferentes, Install y Administrative Install. La primera es la instalación tradicional, donde el programa a instalador está en la máquina a instalar, mientras que la segunda corresponde a una instalación de red, donde hay una fuente desde donde los usuarios de la red pueden instalarse la aplicación.

Un punto a destacar es la instalación silenciosa, o sin interfaz de usuario. No es posible configurar un instalador para que se instale de manera silenciosa, la única manera de hacerlo es a través de la línea de comandos de Windows Installer (msiexec.exe).

Custom Actions Editor


Las acciones personalizadas son la característica de los instaladores de Visual Studio que mas flexibilidad aportan a la generación de instaladores. No entraremos en detalle porque escapan un poco del acercamiento básico de este artículo pero a grandes rasgos lo que permiten es definir una serie de acciones a realizar por el instalador. La forma de definir estas acciones es a través de librerías de código, ejecutables o scripts. Por ejemplo:

· Definir una acción personalizada que nos abra una página de internet que nos interese por cualquier razón.

· Que aparezca un formulario para configurar los parámetros iniciales de una aplicación una vez haya finalizado toda la instalación, o cualquier cosa que se nos ocurra.

· Controlar el tiempo del progreso de la instalación y mostrar el tiempo restante al usuario

Algunas características de las Custom Actions son:

· Se ejecutan SIEMPRE una vez haya finalizado todo el proceso de instalación. Es decir primero se llevan a cabo los pasos definidos en los otros puntos del instalador y finalmente se empiezan a ejecutar las CustomActions, en el orden en que se hayan añadido.

· Se pueden definir acciones para los procesos de instalación, desinstalación, confirmación y rollback (deshacer?). Lo mas normal es que una misma acción tenga implementados todos los casos.

Información más detallada de las Custom Actions en MSDN

Launch Conditions Editor

La última sección proporciona información de las dependencias y condiciones que se han de dar en la maquina de destino para que se lleve a cabo la instalación.

Algunas ya aparecen por defecto, por ejemplo la versión del .Net Framework:



Pero además podemos añadir tanto condiciones de inicio cómo que se haga una búsqueda de un fichero, una clave del registro o un instalador en la máquina de destino, y si estas no se cumplen la instalación no se llevará a cabo.

Con todo esto es posible comenzar a crear instaladores sencillos, que permitan realizar las funciones básicas de un instalador y que además cubren muchos de los casos de las aplicaciones empresariales.

Únicamente faltaría compilar el instalador y si no hay errores proceder a la instalación del mismo. Destacar por último que esta instalación puede realizar de varias maneras:

  • Desde el propio Visual Studio, con un menú contextual que aparece sobre el elemento que representa el proyecto en el explorador de soluciones.
  • Desde el propio msi generado, haciendo doble click en el mismo (o con algunas de las opciones de su menú contextual)
  • Directamente desde la línea de comandos con la utilidad msiexec.exe.

Para obtener más información y funcionalidades avanzadas de los proyectos de instalación con Visual Studio podéis consultar el siguiente enlace : http://msdn.microsoft.com/en-us/library/aa372845(VS.85).aspx

También interesante es el siguiente blog donde se muestran una serie de artículos muy interesantes sobre los proyectos de instalación de Visual Studio: http://www.simple-talk.com/dotnet/visual-studio


Esperamos vuestros comentarios con impaciencia!



5 comentarios:

Lídia dijo...

Gracias por publicar este manual sobre como crear proyectos de instalación. Me ha venido muy bien. Aunque me gustaría saber si es posible cambiar la propiedad de DefaultLocation; que no apuntara a Archivos de Programa ni a ninguna otra carpeta que dependa de la unidad donde está instalado Windows.

JASOSA dijo...

Hola Lídia,

Me alegro mucho de que te haya servido el tutorial. Claro que puedes modificar la propiedad DefaultLocation para que apunte donde a ti te interesa: Simplemente sustituye el valor por defecto por lo que tu quieras. Por ejemplo "C:\MiPrograma". Escríbelo sin los corchetes ya que estos se usan para indicar variables del instalador y sin las comillas, directamente en el valor de la propiedad. Pruébalo y si tienes problemas vuelve dejar un comentario y intentaré explicártelo mejor.

Un saludo!

Lídia dijo...

Muchas Gracias.
A veces lo más sencillo es lo que nunca se te ocurre :-p

Anónimo dijo...

muchísimas gracias, me ha sido de bastante utilidad, ;D

alfredo dijo...

buen articulo