Inno Setup dla usługi Windows?

105

Mam usługę .Net Windows. Chcę utworzyć instalator, aby zainstalować tę usługę systemu Windows.

Zasadniczo musi wykonać następujące czynności:

  1. Pakiet installutil.exe(czy to jest wymagane?)
  2. Uruchom installutil.exeMyService.exe
  3. Uruchom MyService

Chcę również zapewnić dezinstalator, który uruchamia następujące polecenie:

installutil.exe /u MyService.exe

Jak to zrobić za pomocą Inno Setup?

devnull
źródło
Myślę, że musisz skorzystać z sekcji [Uruchom]. Zobacz tutaj
Preet Sangha

Odpowiedzi:

233

Nie potrzebujesz installutil.exei prawdopodobnie nie masz nawet praw do jego redystrybucji.

Oto sposób, w jaki robię to w mojej aplikacji:

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

Zasadniczo możesz samodzielnie zainstalować / odinstalować usługę, używając sposobu ManagedInstallerClasspokazanego w moim przykładzie.

W takim razie wystarczy dodać do skryptu InnoSetup coś takiego:

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

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
lubos hasko
źródło
3
możesz spróbować Filename: "net.exe"; Parameters: "start WinServ". jeśli to nie zadziała, możesz po prostu dodać jeszcze jeden przełącznik - start do aplikacji C # i uruchomić usługę systemu Windows bezpośrednio z programu za pomocą klasy ServiceController ( msdn.microsoft.com/en-us/library/ ... ).
lubos hasko
2
+1 Nicei. Zobacz także stackoverflow.com/questions/255056/…
Ruben Bartelink
7
Dla C # neofity (jak ja), to albo trzeba dodać using System.Reflection;lub zmienić Assembly, aby System.Reflection.Assemblyw powyższym kodzie.
rlandster
1
InstallUtil jest częścią platformy dot net, nie potrzebujesz "praw" do jego redystrybucji, jest już obecny w twoim systemie docelowym (zakładając oczywiście, że możesz uruchomić swoją aplikację w pierwszej kolejności)
Andrew Savinykh
10
Z dokumentacji dotyczącej metody InstallHelper w 4.5 - „Ten interfejs API obsługuje infrastrukturę .NET Framework i nie jest przeznaczony do użycia bezpośrednio w kodzie”. Wykryty po otrzymaniu System.InvalidOperationException.
Bratch
8

Oto jak to zrobiłem:

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

Najwyraźniej Inno setup ma następujące stałe do odwoływania się do folderu .NET w twoim systemie:

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

Więcej informacji tutaj .

breez
źródło
5

Możesz użyć

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

stworzyć usługę. Zobacz „ sc.exe ”, aby dowiedzieć się, jak uruchomić, zatrzymać, sprawdzić stan usługi, usunąć usługę itp.

Steven
źródło
2

Jeśli chcesz uniknąć ponownego uruchamiania, gdy użytkownik uaktualnia, musisz zatrzymać usługę przed skopiowaniem exe i zacząć od nowa.

Istnieje kilka funkcji skryptów, które mogą to zrobić w usłudze - funkcje do uruchamiania, zatrzymywania, instalowania i usuwania usługi

Tony Edgecombe
źródło
W Twoim powiązanym artykule prototypy używanych funkcji nie są precyzyjnie przetłumaczone, a ich użycie jest również nieprawidłowe (np. Nie ma czekania na uruchomienie, zatrzymanie usługi itp.).
TLama,