· Andrés Ledo · NET · Lectura en 7 min
C#: Crear instalador NET 6 - Tutorial Inno Setup
En este artículo vamos a ver cómo hacer un instalador para una aplicación .NET 6 aunque el mismo tutorial se puede aplicar para cualquier otra aplicación independientemente del lenguaje de programación.
Índice
- Qué es Inno Setup
- Requisitos
- Forzar el proyecto a 64 bits
- Publicar el proyecto
- Creando el instalador con Inno Setup
Qué es Inno Setup
Inno Setup es un software generador de instaladores para Windows con licencia freeware, disponible en distintos idiomas. Inno Setup emplea una interfaz gráfica en la que el principal elemento es el Script en el cual se establecen los parámetros del instalador, así como se programan algunas funciones o tareas para este.
Inno Setup es compatible con los sistemas operativos: Windows 10, Windows 8, Windows 7, Windows Vista, Windows Server 2003, Windows XP (esto incluye ediciones x64), Windows 2000, Windows NT 4.0 y Windows 9x. Admite la instalación de aplicaciones de 64 bits y la creación de instaladores personalizados.
También permite la creación de accesos directos en el escritorio o en el menú Inicio y la posibilidad de instalar fuentes.
Requisitos
Para seguir el tutorial debemos de descargar e instalar una serie de aplicaciones:
Inno Setup: Nos descargaremos la versión estable y la instalaremos, en caso de que ya lo tengas instalado, asegúrate de tener la última versión, si no es posible que el tutorial no te funcione.
Inno Setup Dependency Installer: Pulsamos en Download source from Github y descomprimimos los ficheros, más adelante los utilizaremos.
Un proyecto .NET 6: Te recomiendo hacer algo parecido a este.
Una máquina virtual (Recomendado): No es necesario, pero sería recomendable que las pruebas de instalación las hicieses en una máquina virtual para evitar dañar tu ordenador.
Forzar el proyecto a 64 bits
Hoy en día prácticamente todos los ordenadores tienen procesadores de 64 bits, por lo que salvo que nuestro destino sea de 32 bits, es recomendable forzar a nuestra aplicación para que se ejecute con una arquitectura x64, con este simple gesto conseguimos un mejor rendimiento.
Para forzar los 64 bits debemos pulsar en Any CPU (al lado de donde escogemos si queremos compilar la aplicación con Debug o con Release), y clicamos en Administrador de configuración.
En la ventana que se nos abre clicamos en Any CPU y pulsamos en Nueva.
En “escriba o seleccione la nueva plataforma” escogemos x64 y dejamos la opción de “copiar configuración de” con Any CPU y marcado el check “Crear nuevas plataformas del proyecto”.
Cerramos todas las ventanas y donde antes nos aparecía Any CPU ahora nos aparecerá x64, muy bien, ya compilamos nuestra aplicación con x64.
Publicar el proyecto
El primer paso es publicar el proyecto en una carpeta para ello abrimos el Visual Studio 2022 y hacemos clic derecho sobre el proyecto y publicar.
Después se nos abrirá una ventana en la que debemos de clicar sobre “Carpeta”.
En el siguiente paso podemos cambiar la ubicación donde se publicarán los ficheros de la aplicación, en mi caso lo dejo por defecto. A continuación nos mostrará la configuración de publicación, pulsamos en “Mostrar todas las configuraciones” y en configuración seleccionamos Release | x64.
En la siguiente ventana pulsamos en “Publicar”.
Habiendo hecho esto ya tendremos los compilados de nuestra aplicación en el directorio escogido.
Creando el instalador con Inno Setup
Llego la hora de crear nuestro instalador, para que todo esto funcione recuerda que debes de tener la última versión de Inno Setup y también recuerda que para que el servicio se ejecute en caso de que sea un proyecto .NET Core 3, NET 5 o NET 6 debes instalar el hosting de Windows.
Bueno comencemos, abrimos Inno Setup y creamos un script vacío.
Guardamos este script vacío en una carpeta. Nos descargamos el fichero Inno Setup Dependency Installer, abrimos el Zip y descomprimos el fichero CodeDependencies.iss y el netcorecheck_x64.exe (se encuentra en la carpeta src del zip) en la misma carpeta.
Nos deberían de quedar 3 ficheros en la carpeta como puedes apreciar en la imagen, en mi caso mi script vacío es el de instalacion.iss. Abrimos nuestro script vacío y escribimos lo siguiente:
//Nombre de la aplicación
#define MyAppName "Test Service"
//Versión de la aplicación
#define MyAppVersion "1.0"
//Autor
#define MyAppPublisher "Andres Ledo"
//Sitio Web de la aplicación
#define MyAppURL "https://andresledo.es"
//Ejecutable del servicio
#define MyAppExeName "ServiceTest.exe"
//Nombre con el que se creará el servicio
#define MyService "Service Test"
//Directorio donde publicastes los ficheros de la aplicación
//ES MUY IMPORTANTE DEJAR EL ASTERISCO DEL FINAL YA QUE INDICA QUE SE COPIEN TODOS LOS FICHEROS DEL DIRECTORIO
#define PublishFolder "E:\Ejemplos\ServiceTest\ServiceTest\bin\Release\net6.0\publish\*"
//Directorio donde se instalará nuestra aplicación
#define InstallationDir "C:\TestService\"
//Nombre que tendrá nuestro instalador
#define InstallerName "Instalador Test Service"
//Agregamos la librería que nos instalará NET 6 en caso de que no este instalado.
#define public Dependency_NoExampleSetup
#include "CodeDependencies.iss"
[Setup]
//GUID de la aplicación, ES MUY IMPORANTE CAMBIARLO, pulsando en Tools -> Generate GUID Inno Setup nos genera uno nuevo.
//Si no se cambia y se da la casualidad de que hay dos aplicaciones que utilizan Inno Setup habran conflictos en la instalación.
AppId={{9DB72F57-1060-4CBD-B287-E4A02E1725E3}
//Mapeo de variables
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={#InstallationDir}{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename={#InstallerName}
//Formato de compresión
Compression=lzma
SolidCompression=yes
//Estilo del instalador
WizardStyle=modern
//Privilegios requeridos
PrivilegesRequired=admin
//Indicamos que la aplicación es de 64 bits.
ArchitecturesInstallIn64BitMode=x64
//Llamamos a la extensión para que instale NET 6 si es necesario
[Code]
function InitializeSetup: Boolean;
begin
Dependency_AddDotNet60Desktop;
Result := True;
end;
//Idiomas del instalador, puedes comentar los que no necesites.
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
[Files]
//Indicamos de donde debe copiar los ficheros el instalador, podemos excluir alguno que no nos interese con Excludes
Source: {#PublishFolder}; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: "conf.xml"
//Incluimos también la librería que nos comprobará si está instalado .NET 6
Source: netcorecheck_x64.exe; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Run]
//Instalamos o actualizamos el servicio si no estamos instalando un servicio puedes comentar estas líneas
Filename: {sys}\sc.exe; Parameters: "stop ""{#MyService}""" ; Flags: runhidden
Filename: {sys}\sc.exe; Parameters: "delete ""{#MyService}""" ; Flags: runhidden
Filename: {sys}\sc.exe; Parameters: "create ""{#MyService}"" start= auto binPath= ""{app}\{#MyAppExeName}""" ; Flags: runhidden
Filename: {sys}\sc.exe; Parameters: "start ""{#MyService}""" ; Flags: runhidden
[UninstallRun]
//Desinstalamos el servicio si no estamos instalando un servicio puedes comentar estas líneas
Filename: "{cmd}"; Parameters: "/C ""taskkill /im {#MyAppExeName} /f /t"
Filename: {sys}\sc.exe; Parameters: "stop ""{#MyService}""" ; Flags: runhidden
Filename: {sys}\sc.exe; Parameters: "delete ""{#MyService}""" ; Flags: runhidden
Con los comentarios que he incluido creo que queda bastante claro lo que hace cada punto, aquí hay varias cosas importantes:
#define PublishFolder: es importante dejar ”/*” del final, ya que este indica que se copien todos los ficheros del directorio.
AppId= es fundamental que sustituyas este GUID por uno nuevo, es muy improbable que encuentres otra instalación en el equipo que tenga el mismo GUID, sin embargo, si haces varios instaladores para diferentes aplicaciones y no lo cambias verás como Inno Setup se cree que es la misma aplicación y en vez de instalar actualiza…
Una vez copiado el script guardamos y en Inno Setup pulsamos en Build - Compile (en la barra de herramientas), esto compilará nuestro instalador. Una vez compilado podemos encontrarlo fácilmente pulsando sobre Build - Open Output Folder.
Para realizar pruebas yo recomiendo hacerlas en una máquina virtual, aunque en principio no debería ocurrir nada en nuestro equipo.
Ejecutamos el instalador y probamos que todo funcione correctamente.
Miramos que el servicio se esté ejecutando.
Comprobamos que nuestro servicio esté realizando la tarea para la que fue creado, en mi caso no hace nada que no sea mostrar la fecha y la hora en un fichero de texto.
Para acabar probamos la desinstalación como si fuese una aplicación normal y corriente desde el panel de control.
Una vez haya finalizado la desinstalación comprobamos que el servicio se haya desinstalado correctamente y ya hemos acabado nuestro instalador.