2009-06-24 19 views

Odpowiedz

180

w klasie Instalatora, dodać moduł obsługi dla zdarzenia AfterInstall. Następnie można wywołać ServiceController w module obsługi zdarzeń, aby uruchomić usługę.

using System.ServiceProcess; 

public ServiceInstaller() 
{ 
    //... Installer code here 
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall); 
} 

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e) 
{ 
    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName)) 
    { 
     sc.Start(); 
    } 
} 

Teraz po uruchomieniu InstallUtil na instalatora będzie zainstalować, a następnie uruchomić usługę.

+39

(komentarz z proponowanej edycji): Lepiej użyć serviceInstaller.ServiceName, jeśli nazwa usługi zostanie zmieniona, użyje poprawnej nazwy bez potrzeby zmiany jej w kodzie. –

+1

Nie zaszkodzi również zawinąć 'ServiceController' w instrukcji using. – ChrisO

+0

Potrzebowałem podać identyfikator instalatora usługi w OnBeforeInstall. Coś jak serviceInstaller = serviceInstaller1; gdzie serviceInstaller1 jest identyfikatorem od projektanta. Wykonanie tego w OnBeforeInstall sprawiło, że powyższe dzieło bezbłędnie dla mnie. Nie próbowałem, ale możesz to zrobić również w wywołaniu ServiceInstaller(). –

0

Automatyczne uruchamianie oznacza, że ​​usługa jest uruchamiana automatycznie podczas uruchamiania systemu Windows. Jak wspomnieli inni, aby uruchomić go z konsoli, powinieneś użyć ServiceController.

+0

Nie chcę tego robić. Szukam zrobić to za jednym razem z poziomu wiersza poleceń lub z poziomu klas usługi Windows. – mickyjtwin

+0

Przepraszam, moja zła, brakowało mi punktu, w którym wyraźnie wykluczyłeś możliwość uruchomienia go przez panel sterowania. –

5

Co powiesz na następujące polecenia?

net start "<service name>" 
net stop "<service name>" 
3

Można użyć następującego wiersza polecenia, aby uruchomić usługę:

net start *servicename* 
2

Zastosowanie ServiceController aby rozpocząć swoją usługę od kodu.

Aktualizacja: I bardziej poprawny sposób, aby uruchomić usługę z poziomu wiersza poleceń jest użycie „sc” (Service Controller) zamiast polecenia „net”.

+6

Dlaczego "sc" jest "bardziej poprawny"? Co jest nie tak z "net start" (i poleceniem cmdlet PSH start-service)? – Richard

+1

Ponieważ sc może być wywołany ze zdalnego komputera, więc zawsze działa. – MacGyver

0

Można użyć klasy GetServices klasy ServiceController , aby uzyskać tablicę wszystkich usług. Następnie znajdź swoją usługę, sprawdzając właściwość każdej usługi. Po znalezieniu usługi wywołaj metodę Start, aby ją uruchomić.

Powinieneś również sprawdzić właściwość Status, aby zobaczyć, w jakim stanie jest już przed wywołaniem startu (może być uruchomiony, wstrzymany, zatrzymany itp.).

4

programowe dla służb kontrolujących opcje:

  • natywnego kodu może być używany, "Starting a Service". Maksymalna kontrola przy minimalnych zależnościach, ale najwięcej pracy.
  • WMI: Win32_Service ma metodę StartService. Jest to dobre w przypadkach, gdy musisz mieć możliwość wykonania innego przetwarzania (np. Wyboru usługi).
  • PowerShell: wykonaj Start-Service przez RunspaceInvoke lub przez utworzenie własnego Runspace i użyj metody CreatePipeline do wykonania. Jest to dobre w przypadkach, gdy musisz mieć możliwość wykonania innego przetwarzania (np. Wyboru usługi) przy znacznie łatwiejszym modelu kodowania niż WMI, ale zależy to od zainstalowanego PSH.
  • aplikacja .NET można używać ServiceController
23

Po refactoring trochę, to jest przykładem kompletnego instalatora usługi Windows z automatycznym start:

using System.ComponentModel; 
using System.Configuration.Install; 
using System.ServiceProcess; 

namespace Example.of.name.space 
{ 
[RunInstaller(true)] 
public partial class ServiceInstaller : Installer 
{ 
    private readonly ServiceProcessInstaller processInstaller; 
    private readonly System.ServiceProcess.ServiceInstaller serviceInstaller; 

    public ServiceInstaller() 
    { 
     InitializeComponent(); 
     processInstaller = new ServiceProcessInstaller(); 
     serviceInstaller = new System.ServiceProcess.ServiceInstaller(); 

     // Service will run under system account 
     processInstaller.Account = ServiceAccount.LocalSystem; 

     // Service will have Start Type of Manual 
     serviceInstaller.StartType = ServiceStartMode.Automatic; 

     serviceInstaller.ServiceName = "Windows Automatic Start Service"; 

     Installers.Add(serviceInstaller); 
     Installers.Add(processInstaller); 
     serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;    
    } 
    private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e) 
    { 
     ServiceController sc = new ServiceController("Windows Automatic Start Service"); 
     sc.Start(); 
    } 
} 
} 
+1

Ten kod spowodował wystąpienie następującego błędu/ów: Wystąpił wyjątek podczas fazy instalacji. System.InvalidOperationException: Wystąpił wyjątek w module obsługi zdarzenia OnAfterInstall System.ServiceProcess.ServiceInstaller. Wyjątek wewnętrzny wyjątek System.InvalidOperationException został zgłoszony z następującym komunikatem o błędzie: Nie można uruchomić usługi nazwa_usługi na komputerze "." .. Wyjątek wewnętrzny Wyjątek System.ComponentModel.Win32Exception został zgłoszony z następującym komunikatem o błędzie: Program wykonywalny tej usługi jest skonfigurowany do uruchamiania nie implementuje usługi. – goamn

+1

Błędy zajęte, gdy skomentowałem linię "InitializeComponent()". Sądzę, że ta linia powtarza wszystkie pozostałe wiersze, ponieważ dzienniki zdają się pokazywać dwie identyczne rzeczy, które występują razem przed wystąpieniem błędu: Instalowanie usługi serviceName ... Usługa nazwa usługi została pomyślnie zainstalowana. Tworzenie usługi nazwa-źródła źródła zdarzeń w aplikacji rejestru ... Instalowanie usługi serviceName ... Tworzenie usługi nazwa-źródła źródła zdarzeń w aplikacji log ... Wystąpił wyjątek w module obsługi zdarzeń OnAfterInstall System.ServiceProcess.ServiceInstaller. – goamn

+0

Naprawdę uratowałeś mój dzień :) Dziękuję za ten użyteczny komentarz. Po tym, jak skomentowałem wywołanie InitializeComponent(), moja usługa również zaczęła się doskonale – Konstantin

0

Ty uszkodzony projektanta.Wprowadź ponownie swój komponent instalatora. Powinien mieć serviceInstaller i serviceProcessInstaller. Narzędzie serviceInstaller z właściwością Metoda uruchamiania ustawiona na Automatycznie uruchomi się po zainstalowaniu i po każdym ponownym uruchomieniu.

1

Mimo dokładnego zaakceptowania odpowiedzi, nadal nie byłem w stanie uruchomić usługi - zamiast tego podczas instalacji podano komunikat o błędzie, że usługa, która została właśnie zainstalowana, nie może zostać uruchomiona, ponieważ nie istnieje mimo korzystania this.serviceInstaller.ServiceName raczej niż dosłowna ...

I w końcu znaleźć alternatywne rozwiązanie sprawia, że ​​korzystanie z linii poleceń:

private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) { 
     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     startInfo.FileName = "cmd.exe"; 
     startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName; 

     Process process = new Process(); 
     process.StartInfo = startInfo; 
     process.Start(); 
    } 
0

Tylko uwaga: można skonfigurowaniu usługi w różny sposób za pomocą tworzy interfejs do dodawania instalatora serwisów i instalatora projektu. W takim przypadku zastąp miejsce, w którym znajduje się nazwa serviceInstaller.ServiceName z "name from designer" .ServiceName.

W tym przypadku nie potrzebujesz również prywatnych członków.

Dzięki za pomoc.

Powiązane problemy