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:

  1. installutil.exe Pack (¿Es necesario?)
  2. Ejecutar installutil.exe MiServicio.exe
  3. 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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top