Inno Setup per il servizio Windows?


105

Ho un servizio Windows .Net. Voglio creare un programma di installazione per installare quel servizio Windows.

Fondamentalmente, deve fare quanto segue:

  1. Pack installutil.exe(è necessario?)
  2. Esegui installutil.exeMyService.exe
  3. Avvia MyService

Inoltre, voglio fornire un programma di disinstallazione che esegua il seguente comando:

installutil.exe /u MyService.exe

Come farlo usando Inno Setup?


Penso che sia necessario utilizzare la sezione [Esegui]. Vedi qui
Preet Sangha,

Risposte:


233

Non hai bisogno installutil.exee probabilmente non hai nemmeno i diritti per ridistribuirlo.

Ecco come lo sto facendo nella mia applicazione:

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());
    }
}

Fondamentalmente puoi avere il tuo servizio da installare / disinstallare da solo usando ManagedInstallerClasscome mostrato nel mio esempio.

Quindi è solo questione di aggiungere nello script InnoSetup qualcosa del genere:

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

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"

3
puoi provare Filename: "net.exe"; Parameters: "start WinServ". se non funziona, puoi semplicemente aggiungere un altro switch --start alla tua applicazione c # e avviare il servizio Windows direttamente dal programma utilizzando la classe ServiceController ( msdn.microsoft.com/en-us/library/… ).
lubos hasko,


7
Per la C # neofita (come me), vi sia bisogno di aggiungere una using System.Reflection;o cambiare Assemblyper System.Reflection.Assemblyil codice di cui sopra.
rlandster

1
InstallUtil fa parte del dot net framework, non hai bisogno di "diritti" per ridistribuirlo, è già presente sul tuo sistema di destinazione (supponendo che tu possa eseguire la tua app in primo luogo, ovviamente)
Andrew Savinykh,

10
Dalla documentazione sul metodo InstallHelper in 4.5 - "Questa API supporta l'infrastruttura .NET Framework e non è concepita per essere utilizzata direttamente dal codice." Scoperto dopo aver ricevuto System.InvalidOperationException.
Bratch

8

Ecco come l'ho fatto:

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

Apparentemente, l'installazione di Inno ha le seguenti costanti per fare riferimento alla cartella .NET sul tuo sistema:

  • {} Dotnet11
  • {} Dotnet20
  • {} Dotnet2032
  • {} Dotnet2064
  • {} Dotnet40
  • {} Dotnet4032
  • {} Dotnet4064

Maggiori informazioni disponibili qui .


5

Puoi usare

Exec(
    ExpandConstant('{sys}\sc.exe'),
    ExpandConstant('create "MyService" binPath= {app}\MyService.exe start= auto DisplayName= "My Service" obj= LocalSystem'), 
    '', 
    SW_HIDE, 
    ewWaitUntilTerminated, 
    ResultCode
    )

per creare un servizio. Vedere " sc.exe " su come avviare, arrestare, controllare lo stato del servizio, eliminare il servizio, ecc.


2

Se si desidera evitare il riavvio quando l'utente esegue l'aggiornamento, è necessario arrestare il servizio prima di copiare l'exe e ricominciare dopo.

Ci sono alcune funzioni di script per farlo in Servizio - Funzioni per avviare, arrestare, installare, rimuovere un servizio


Nel tuo articolo collegato i prototipi delle funzioni utilizzate non sono tradotti con precisione e anche il loro utilizzo non è corretto (ad esempio, non c'è attesa per l'avvio, l'arresto del servizio, ecc.).
TLama
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.