.NET i takie tam

Windows Services

with 3 comments

Odkąd pracuję z Visual Studio tworzenie usług sytemu Windows (ang. Windows service), zawsze było żmudnym procesem. Co by nie powiedzieć o usprawnieniach wprowadzanych w kolejnych wersjach środowiska, proces ten nie uległ znaczącym zmianom. Chyba największym problemem jest pracochłonny i kłopotliwy proces testowania, który wymaga wykonania następujących kroków:

  • Zainstalowania naszej usługi w systemie, konieczny jest do tego specyficzny instalator – opis jak takowy przygotować można znaleźć m.in. tutaj. Sam projekt powinien być skompilowany w trybie Debug, aby zachować informacje o ustawionych breakpoint’ach.
  • Do katalogu w którym zainstalowaliśmy naszą program, kopiujemy plik *.pdb który znajdziemy w katalogu bin naszego projektu.
  • Uruchamiamy usługę. Możemy skorzystać z Panelu Sterowania lub wystukać na linki komend net start „nazwa naszej usługi”
  • Uruchamiamy Visual Studio i z menu Tools wybieramy Attach to Process (lub wciskamy: Ctrl + Alt + P), pojawia się przed nami następujące okienko:

image

  • Z listy dostępnych procesów wybieramy ten reprezentujący naszą usługę. Ponieważ, zwykle usługi działają ze specjalnymi uprawnieniami, musimy najpierw zaznaczyć opcję Show processes from all users.
  • Klikamy Attach i Visual Studio podłączy się do naszego procesu. Dzięki skopiowanemu wcześniej plikowi *.pdb, zawierającemu symbole debugowania środowisko będzie wstanie określić położenie kodu źródłowego naszej aplikacji. W przypadku gdy źródła będą niedostępne, zostaniemy poproszeni o podanie ich położenia.
  • I możemy swobodnie debugować.

Niestety, cały proces musimy powtórzyć gdy zmodyfikujemy kod i ponownie chcemy go przetestować.

Problemem jaki możemy napotkać po drodze są kłopoty z ponowną instalacją naszej usługi, komunikat:

image

Nie doszedłem czym jest on spowodowany, jednak podejrzewam, że nie wszystko zostało, prawidłowo usunięte podczas wcześniejszej de-instalacji. Aby temu zaradzić, musimy ręcznie odinstalować usługę. Z linii komend wpisujemy polecenie:

sc delete „nazwa naszej usługi”

Wszystko powyższe sprawdza się jeśli korzystamy z systemu Windows XP, jeśli jednak używamy osławionej Visty. W liście procesów okna Attach to Process, nie pojawi się pozycja reprezentująca naszą aplikację. Ma to prawdopodobnie ma to związek z nową architekturą zabezpieczeń systemu. W takim wypadku ‚zewnętrze’ podłączenie środowiska do procesu możemy zastąpić jedną linią kodu, która spowoduje automatyczne uruchomienie debugger’a:

System.Diagnostics.Debugger.Launch();

Oczywiście nie zmienia to faktu, że musimy naszą usługę zainstalować i przekopiować odpowiednie pliki. Inną użytecznym poleceniem może być:

System.Diagnostics.Debugger.Break();

która wymusi wstrzymanie wykonania programu. Dobrze jest umieścić powyższe metody w dyrektywie kompilacji warunkowej, aby przypadkiem nie zostały, częścią finalnej wersji programu.

#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif

Written by sakowicz

Marzec 18, 2008 @ 4:24 pm

Napisane w .NET, Tools

Odpowiedzi: 3

Subscribe to comments with RSS.

  1. Zazwyczaj w serwisie powołuje się wątek, który wykonuje jakąś czarną robotę. Wątek ten zazwyczaj pracuje na obiekcie, który w tym celu tworzę (Worker). Wtedy w pliku ‚Program.cs’ piszę coś takiego:

    static void Main()
    {

    #if DEBUG
    Worker w = new Worker();
    w.Process();
    return;
    #endif
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] { new Service1() };
    ServiceBase.Run(ServicesToRun);

    }

    i sobie debuguję🙂

    dario-g

    Marzec 19, 2008 at 10:34 am

  2. Można to osiągnąć dużo prościej.
    1. Masz projekt z serwisem windowsowym
    2. Instalujesz serwis w systemie za pomocą installutil /i „sciezka_do_serwisu”
    Jako sciezke wybieramy sciezke do katalogu Debug

    Gdy chcemy debugowac po prostu startujemy serwis przez services.msc, atach do procesu i już działa

    mczerwinski

    Marzec 19, 2008 at 8:21 pm

  3. Konsola jest najwygodniejsza. Start/Attach za kazdym razem jak chce uruchomic program, to by mnie wykonczylo nerwowo.

    Pawel Pabich

    Marzec 19, 2008 at 9:53 pm


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: