¿Inno Setup para el servicio de Windows?

105

Tengo un servicio .Net de Windows. Quiero crear un instalador para instalar ese servicio de Windows.

Básicamente, tiene que hacer lo siguiente:

  1. Pack installutil.exe(¿Es necesario?)
  2. Ejecute installutil.exeMyService.exe
  3. Iniciar MyService

Además, quiero proporcionar un desinstalador que ejecute el siguiente comando:

installutil.exe /u MyService.exe

¿Cómo hacer esto usando Inno Setup?

devnull
fuente
Creo que necesitas usar la sección [Ejecutar]. Vea aquí
Preet Sangha

Respuestas:

233

No lo necesita installutil.exey probablemente ni siquiera tenga 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, puede hacer que su servicio se instale / desinstale por sí solo usando ManagedInstallerClasscomo se muestra en mi ejemplo.

Entonces solo es cuestión de agregar a su script InnoSetup algo como esto:

[Run]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--install"

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
lubos hasko
fuente
3
puedes probar Filename: "net.exe"; Parameters: "start WinServ". si no funciona, puede agregar un conmutador más: inicie su aplicación c # e inicie el servicio de Windows directamente desde el programa usando la clase ServiceController ( msdn.microsoft.com/en-us/library/… ).
lubos hasko
2
+1 Niza. Véase también stackoverflow.com/questions/255056/…
Ruben Bartelink
7
Para el neófito C # (como yo), que sea necesario añadir una using System.Reflection;o cambiar Assemblya System.Reflection.Assemblyen el código anterior.
rlandster
1
InstallUtil es parte del marco dot net, no necesita "derechos" para redistribuirlo, ya está presente en su sistema de destino (suponiendo que pueda ejecutar su aplicación en primer lugar, por supuesto)
Andrew Savinykh
10
De la documentación sobre el método InstallHelper en 4.5: "Esta API es compatible con la infraestructura de .NET Framework y no está diseñada para usarse directamente desde su código". Descubierto después de recibir System.InvalidOperationException.
Bratch
8

Así es como lo hice:

Exec(ExpandConstant('{dotnet40}\InstallUtil.exe'), ServiceLocation, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);

Aparentemente, la configuració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í .

Breez
fuente
5

Puedes usar

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.

Steven
fuente
2

Si desea evitar reinicios cuando el usuario actualiza, debe detener el servicio antes de copiar el archivo exe y comenzar de nuevo después.

Hay algunas funciones de script para hacer esto en Servicio: funciones para iniciar, detener, instalar, eliminar un servicio

Tony Edgecombe
fuente
En su artículo vinculado, los prototipos de las funciones utilizadas no se traducen con precisión y su uso tampoco es correcto (por ejemplo, no hay que esperar a que el servicio se inicie, se detenga, etc.).
TLama