Usługi Windows to wygodny sposób na uruchamianie naszych aplikacji przy starcie, zapewnienie im automatycznych restartów jak również możliwość impersonacji na wybrane konto.
Choć Visual Studio pozwala na stworzenie specjalnego typu projektu do celów utworzenia usługi Windows to jednak jest to szalenie niewygodne – zarówno pod kątem tworzenia i debugowania jak i instalacji takowej usługi w systemie docelowym.
Znacznie wygodniejszym rozwiązaniem jest użycie biblioteki TopShelf.
Czym jest TopShelf?
TopShelf to swego rodzaju wrapper obsługujący wszystkie operacje związane z usługami Windows – od definicji usługi, po spięcie z akcjami startu i zatrzymania po obsługę instalacji usługi. Dodatkowo, aplikację stworzoną w oparciu o TopShelf możemy wygodnie uruchomić jako aplikację konsolową – dzięki czemu jej debugowanie staje się bajecznie łatwe.
Instalacja TopShelf
Instalacja jest bardzo prosta i sprowadza się do zainstalowania paczku NuGeta:
Install-Package TopShelf
Jeśli w projekcie używamy NLoga, to możemy zainstalować od razu paczkę ze wsparciem dla niego – TopShelf użyje go do logowania informacji dotyczących stanu usługi oraz procedury startu i zatrzymania:
Install-Package TopShelf.NLog
Tworzenie usługi
W projekcie typu Console Application usługę przy użyciu TopShelf definiujemy w następujący sposób:
private static void Main(string[] args) { HostFactory.Run(x => { x.SetServiceName("MyService"); x.SetDisplayName("MyService"); x.SetDescription("This is sample service powered by TopShelf."); x.StartAutomatically(); x.UseNLog(); x.Service(service => { service.ConstructUsing(srv => new MyService()); service.WhenStarted(srv => srv.Start()); service.WhenStopped(srv => srv.Stop()); }); }); }
W powyższym kodzie:
- Linie 5-7 opisują tworzoną usługę. Najistotniejsza jest linia 5, gdyż definiuje ona nazwę usługi, którą w przyszłości możemy używać w skryptach (np. wywołując polecenie net start MyService).
- Linia 9 definiuje oczekiwane zachowanie w czasie startu systemu – w powyższym przykładzie usługa wystartuje automatycznie.
- Linia 11 określa, że chcemy aby TopShelf użył NLoga jako loggera.
- Linie 13-19 opisują w jaki sposób utworzyć klasę obsługującą usługę (linia 15) oraz wskazują jakie zachowania usługi chcemy obsługiwać oraz wskazują metody do ich obsługi.
Tak utworzoną aplikację możemy z miejsca wystartować jako aplikację konsolową, w tym także z podłączonym debuggerem. TopShelf uruchomi aplikację w trybie interaktywnym a także przechwyci na sekwencję Ctrl+C do celów czystego zamknięcia aplikacji przy użyciu zdefiniowanej w WhenStopped metody.
Instalacja usługi
Aby zainstalować aplikację jako usługę systemową uruchamiamy konsolę w trybie administratora, przechodzimy do katalogu z binarkami aplikacji i wydajemy komendę:
MyService.exe install
Tak zainstalowaną usługą możemy sterować przy użyciu komend:
net start MyService net stop MyService
TopShelf wspiera także deinstalację usługi, jest ona równie prosta:
MyService.exe uninstall
Instancje
Ciekawą i bardzo przydatną funkcją TopShelf są instancje – aplikację możemy zainstalować kilkukrotnie na jednym systemie podając unikatową nazwę instancji:
MyService.exe install /instance:First MyService.exe install /instance:Second
Uruchomienie poszczególnych instancji wygląda wtedy następująco:
net start MyService$First net start MyService$Second
Podsumowanie
Powyżej zaprezentowałem tylko podstawowe i najbardziej przydatne funkcje TopShelfa. Jeśli potrzebujesz większej kontroli nad usługą – jak np. definiowanie na jakim koncie ma działać usługa lub jak ma wyglądać jej polityka przywracania po awarii – zachęcam do zapoznania się z dokumentacją.
Dodaj komentarz