Inno Setup para el servicio de Windows?
-
11-09-2019 - |
Pregunta
Tengo un servicio de Windows .Net. Quiero crear un instalador para instalar que el servicio de Windows.
Básicamente, tiene que hacer lo siguiente:
-
installutil.exe
Pack (¿Es necesario?) - Ejecutar
installutil.exe
MiServicio.exe - Inicio MyService
Además, quiero proveer un desinstalador que se ejecuta el siguiente comando:
installutil.exe /u MyService.exe
¿Cómo hacer esto mediante la disposición de Inno?
Solución
No es necesario installutil.exe
y probablemente ni siquiera tener derechos para redistribuirlo.
Esta es la forma en que lo estoy haciendo en mi aplicación:
using System;
using System.Collections.Generic;
using System.Configuration.Install;
using System.IO;
using System.Linq;
using System.Reflection;
using System.ServiceProcess;
using System.Text;
static void Main(string[] args)
{
if (System.Environment.UserInteractive)
{
string parameter = string.Concat(args);
switch (parameter)
{
case "--install":
ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
break;
case "--uninstall":
ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
break;
}
}
else
{
ServiceBase.Run(new WindowsService());
}
}
Básicamente, usted puede tener su servicio para instalar / desinstalar por sí mismo mediante el uso de ManagedInstallerClass
como se muestra en mi ejemplo.
Entonces es sólo cuestión de añadir en su InnoSetup guión algo como esto:
[Run]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--install"
[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
Otros consejos
Así es como lo hice:
Exec(ExpandConstant('{dotnet40}\InstallUtil.exe'), ServiceLocation, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
Al parecer, la disposición de Inno tiene las siguientes constantes para hacer referencia a la carpeta .NET en su sistema:
- {dotNet11}
- {dotnet20}
- {dotnet2032}
- {dotnet2064}
- {dotnet40}
- {dotnet4032}
- {dotnet4064}
Más información disponible aquí .
Puede utilizar
Exec(
ExpandConstant('{sys}\sc.exe'),
ExpandConstant('create "MyService" binPath= {app}\MyService.exe start= auto DisplayName= "My Service" obj= LocalSystem'),
'',
SW_HIDE,
ewWaitUntilTerminated,
ResultCode
)
para crear un servicio. Consulte " sc.exe " sobre cómo iniciar, detener, comprobar el estado del servicio, eliminar el servicio, etc.
Si se quiere evitar reinicios cuando el usuario actualiza entonces usted necesita para detener el servicio antes de copiar el exe y empezar de nuevo después.
Hay algunas funciones de script para hacer esto en de servicio - Funciones para empezar, parar, instalar, eliminar un servicio