2009-09-20 27 views
94

Mam usługę .Net Windows. Chcę utworzyć instalator, aby zainstalować tę usługę Windows.Inno Setup dla usługi Windows?

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

  1. Paczka installutil.exe (jest wymagany?)
  2. Uruchom installutil.exe MyService.exe
  3. start MyService

Również chcę aby udostępnić deinstalator, który uruchomi następującą komendę:

installutil.exe /u MyService.exe 

Jak wykonać te czynności za pomocą Inno Setup?

+0

Myślę, że musisz skorzystać z sekcji [Uruchom]. Zobacz [tutaj] (http://www.vincenzo.net/isxkb/index.php?title = Inno_Setup_Help _-_ 'Run'_and_UninstallRun'_sections) –

Odpowiedz

206

Nie potrzebujesz installutil.exe i prawdopodobnie nie masz nawet uprawnień do redystrybucji.

Oto sposób 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żna mieć swoją usługę zainstalować/usunąć we własnym zakresie za pomocą ManagedInstallerClass jak pokazano na moim przykładzie.

to jest to po prostu kwestia dodając do swojej InnoSetup skryptu coś takiego:

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

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

Wielkie dzięki! To działało jak magia. Jeszcze jedno wyjaśnienie. Jak uruchomić polecenie takie jak net start WinServ w Inno Script? – devnull

+3

możesz wypróbować "Filename:" net.exe "; Parametry: "start WinServ" '. jeśli to nie zadziała, możesz po prostu dodać jeszcze jeden przełącznik - uruchom program C# i uruchom usługę Windows bezpośrednio z programu przy użyciu klasy ServiceController (http://msdn.microsoft.com/en-us/library/ system.serviceprocess.servicecontroller.aspx). –

+0

Tak, to zadziałało! --start z klasą ServiceController. Jeszcze raz dziękuję! – devnull

1

Jeśli chcesz uniknąć restartów, gdy aktualizacje użytkowników to trzeba zatrzymać usługę przed skopiowaniem exe i uruchomić ponownie po .

Istnieją pewne funkcje skryptowe, aby to zrobić w Service - Functions to Start, Stop, Install, Remove a Service

+0

W twoim połączonym artykule prototypy używanych funkcji nie są dokładnie tłumaczone, a ich użycie również nie jest poprawne (np. Nie ma czekania na uruchomienie usługi, zatrzymanie itp.). – TLama

1

Można 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ę. Patrz „Sc.exe”, w jaki sposób uruchomić, zatrzymać, sprawdzić stan usługi, usunąć usługę itp

6

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 dla przedstawieniu folder .NET w systemie:

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

Więcej informacji można znaleźć here.

Powiązane problemy