C# - Szerviz alkalmazás készítése

forráskód letöltése
Ebben a példában arra keressük a választ, hogy miként készíthetünk olyan alkalmazást, mely szervizként futtatható, vagyis akár a felhasználó bejelentkezése nélkül és az operációs rendszer működésének kezdetétől annak leállításáig mindvégig futhat a háttérben.
Mellékelt példában egy olyan szerviz alkalmazást készítünk, mely minden elindulásakor és leállításakor egy TXT állományba írja az aktuális időpontot, valamint azt hogy melyik esemény történt e kettő közül.
Mivel ez az alkalmazás szervizként fut, így ahányszor elindítjuk, illetve leállítjuk a számítógépet, ennek időpontja bekerül ebbe a TXT-be, így ezzel nyomon követhető, hogy mikor lett használva az adott számítógép.
Egy új szerviz alkalmazás készítéséhez válasszuk a File – New – Project menüpontot, majd a Visual C# Project-ből Windows Service tételt. Ekkor létrejön egy új project, benne egy WinService1.cs forrás állomány, melyben megtaláljuk a szerviz alkalmazásunk osztályát, amely a ServiceBase osztályból lett származtatva.
Amikor egy szerviz alkalmazás elindul, akkor fut az OnStart függvénye. Mivel erre most szükségünk van, így célszerű felülírni ezt a függvényt.
        protected override void OnStart(string[] args)
        {
A TXT megnyitásához a File osztály Open függvényét használjuk, melynek első paraméterébe megadjuk az állomány nevet elérési útvonallal, majd másodikként a OpenOrCreate konstanst, mellyel azt írjuk elő, hogy az állomány legyen megnyitva, vagy ha még nem létezne, akkor egyúttal létre is jöjjön. Visszatérési értékként egy Stream osztályt kapunk, melyet egy változóba el is tárolunk.
          Stream st = File.Open("c:\\log.txt", FileMode.OpenOrCreate);
Következő lépésként a Stream osztály Seek függvényével az állomány végére pozícionálunk. Ezt úgy tesszük, hogy a Seek első paraméterébe nulla értéket írunk, a másodikba pedig a SeekOrigin felsorolt típus End elemét. Ezzel azt mondjuk meg, hogy az aktuális állomány mutató az állomány végéhez képest nulla bájttal legyen elmozdítva.
          st.Seek(0, SeekOrigin.End);
Az aktuális bejegyzésünk kiírásához egy BinaryWriter osztályt hozunk létre.
          BinaryWriter bw = new BinaryWriter(st);
Ennek Write függvényével képesek vagyunk szinte bármilyen típusú adat kiírására. Jelen esetben most egy sztringet fogunk az állományba írni, mely tartalmazza az adott eseményt, illetve az aktuális időpontot.
          bw.Write(" OnStart: "+DateTime.Now.ToString());
Végül le kell zárnunk a megnyitott Stream-et.
          st.Close();
        }
A másik eseményhez, vagyis amikor a szerviz leáll, az OnStop függvényt kell felülírnunk a ServiceBase osztályból. Itt ugyanazzal a módszerrel nyitjuk meg az iménti állományt, és ugyanúgy írunk bele, csak most az OnStop eseményt jelezzük.
        protected override void OnStop()
        {
          Stream st = File.Open("c:\\log.txt", FileMode.OpenOrCreate);
          st.Seek(0, SeekOrigin.End);
          BinaryWriter bw = new BinaryWriter(st);
          bw.Write(" OnStop: "+DateTime.Now.ToString());
          st.Close();
        }
Ezzel szerviz alkalmazásunk lényegi része el is készült. Használatához viszont telepítenünk kell a többi szerviz alkalmazáshoz hasonlóan.
A telepítés menetét megkönnyítendő válaszuk ki a „WinService1.cs [Design]” lapot. Ha ez megvan, akkor a Properties ablak alsó részén látható lesz egy Add Installer link. Kattintsunk erre. Ennek hatására létrejön a projektünkhöz egy új forrás állomány ProjectInstaller.cs névvel. Ebbe automatikusan bekerül egy ServiceProcessInstaller és egy ServiceInstaller komponens mely segít elvégezni a telepítést, eltávolítást.
Válasszuk a serviceInstaller1 komponenst és a DisplayName property-ének adjunk értékül a _FirstSample szöveget.
Ezzel azt érjük el, hogy a rendszer szerviz kezelő alkalmazásában a mi szervizünk _FirstSample névvel jelenik meg a listában elsőként, hacsak más szerviz neve nem kezdődik _ jellel.
Válasszuk most a serviceProcessInstaller1 komponenst, majd az Account property-be a LocalSystem elemet jelöljük ki.
Fordítsuk le az alkalmazást a Build – Build menüpont kiválasztásával. Itt most nem futtathatjuk a programot, hiszen ez egy szerviz alkalmazás, így azt csak az operációs rendszer futtathatja.
A tényleges telepítés elvégzéséhez még szükségünk lesz egy kis segédprogramra, mely része a Visual Studio.NET-nek. Ez az InstallUtil.exe lesz. Ennek kell paraméterként megadnunk a telepítendő szerviz alkalmazásunk EXE-jét elérési útvonallal. Ehhez indítsunk egy parancssort, méghozzá a Start - Programs - Microsoft Visual Studio.NET - Visual Studio.NET Tools - Visual Studio.NET Command Prompt menüponton keresztül. Erre a speciális parancssorra azért van szükség, hogy az InstallUtil alkalmazás bárhonnan elérhető legyen.
installutil D:\Cso\0116\Service\bin\Debug\WindowsService1.exe
Az elérési útvonal természetesen mindig az aktuális legyen, ahol a szerviz alkalmazásunk is található.
Ha ez megvan, akkor indítsuk el a Control Panel-ben lévő szerviz kezelő alkalmazást (Services), itt a telepített szervizek listájában már látszania kell a _FirstSample programnak. Válasszuk ki és a Start Services gombbal és indítsuk el. Ekkor létrejön a C:\ könyvtárban a log.txt állomány. Ha ezek után leállítjuk az alkalmazásunkat a Stop Services gombbal, akkor ennek időpontja is be kell kerüljön a log.txt-be.
Ha szeretnénk eltávolítani a szervizek közül az alkalmazásunkat, akkor ismét az InstallUtil.exe segédprogramot kell használnunk. Most viszont egy /u paramétert is kell használnunk jelezve, hogy most nem telepítés, hanem eltávolítás van.
installutil /u D:\Cso\0116\Service\bin\Debug\WindowsService1.exe