¿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?


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"

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


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í .


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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.