2009-09-20 63 views
94

Tengo un servicio .Net de Windows. Quiero crear un instalador para instalar ese servicio de Windows.¿Inno Setup para el servicio de Windows?

Básicamente, tiene que hacer lo siguiente:

  1. Paquete installutil.exe (¿es necesario?)
  2. Run installutil.exe MiServicio.exe
  3. inicio MyService

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

installutil.exe /u MyService.exe 

¿Cómo hacer esto usando Inno Setup?

+0

Creo que necesita usar la sección [Ejecutar]. Ver [aquí] (http://www.vincenzo.net/isxkb/index.php?title = Inno_Setup_Help _-_ 'Run'_and_'UninstallRun'_sections) –

Respuesta

206

No necesita installutil.exe y probablemente ni siquiera tiene derecho a redistribuirlo.

Aquí es la forma en que lo estoy haciendo en mi solicitud:

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" 
+0

¡Muchas gracias! Eso funcionó como magia. Una aclaración más. ¿Cómo ejecutar un comando como net start WinServ en Inno Script? – devnull

+3

puede intentar 'Filename:" net.exe "; Parámetros: "iniciar WinServ" '. si no funciona, simplemente podría agregar un interruptor más - comience a su aplicación C# e inicie el servicio de Windows directamente desde el programa utilizando la clase ServiceController (http://msdn.microsoft.com/en-us/library/ system.serviceprocess.servicecontroller.aspx). –

+0

¡Sí, eso también funcionó! --comience con la clase ServiceController. ¡Gracias de nuevo! – devnull

1

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

Hay algunas funciones de script para hacer esto en Service - Functions to Start, Stop, Install, Remove a Service

+0

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 que el servicio se inicie, se detiene etc.). – TLama

1

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.

6

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 hace referencia a la carpeta .NET en su sistema:

  • {} dotNet11
  • {} dotnet20
  • {} dotnet2032
  • {} dotnet2064
  • {} dotnet40
  • {} dotnet4032
  • {} dotnet4064

Más información disponible here.

Cuestiones relacionadas