Icono del sitio Andrés Ledo

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.

Este tutorial se basa en la aplicación que generamos en el artículo «Cómo crear un servicio con .NET 6» os recomiendo que antes leáis este tutorial, en especial la parte de agregar el paquete Nuget al servicio. Si estáis haciendo un servicio sin agregar el paquete no os arrancará.

Requisitos

Para seguir el tutorial debemos de descargar e instalar una serie de aplicaciones:

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
Lenguaje del código: PHP (php)

Con los comentarios que he incluido creo que queda bastante claro lo que hace cada punto, aquí hay varias cosas importantes:

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.

Salir de la versión móvil