CREAZIONE DI UN SERVIZIO WINDOWS CON VISUAL STUDIO
In un sistema operativo Windows, un
servizio è un’entità, a cui è associato un eseguibile, che effettua operazioni
senza l’intervento di un utente specifico, perché il servizio “appartiene” al
sistema operativo.
Solitamente è utilizzato per
operazioni in cui non deve essere richiesto l’intervento dell’utente.
Ma vediamo come creare un servizio
windows con Visual Studio.
Visual Studio solitamente ha tra i
suoi Modelli di progetto anche il Servizio Windows, comunque è possibile creare
direttamente una classe che implementa la classe base System.ServiceProcess.ServiceBase. Questa
classe contiene un metodo astratto OnStart(string[] args) , che verrà chiamato
quando il servizio viene avviato.
Purtroppo però non è possibile
eseguire il debug su Visual Studio come eseguiamo il debug con altri programmi
che presentano il metodo main. Per provare il nostro programma dobbiamo
compilare l’eseguibile exe che per funzionare dovrà essere installato sul
sistema. Ecco che la sovrastruttura .NET ci agevola il tutto aggiungendo un
installer al nostro progetto.
Un Installer per un servizio non è
altro che una classe che eredita da una classe della piattaforma .NET i cui
metodi verranno chiamati da un apposito tool (InstallUtil) per installare il
servizio.
Ecco i due modi possibili per aggiungere un
installer alla nostra classe:
1. Apriamo la
nostra classe in Design Mode, e cliccando col tasto destro su uno spazio vuoto,
scegliamo “Add Installer”
2. Aggiungendo
una classe che eredita da System.Configuration.Install.Installer
Seguendo il secondo metodo,
aggiungiamo manualmente una classe e la facciamo ereditare da System.Configuration.Install.Installer.
A questa classe aggiungiamo due
proprietà:
private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
private
System.ServiceProcess.ServiceInstaller
serviceInstaller1;
La prima proprietà è l’installer relativo al processo che verrà lanciato dal nostro
servizio, mentre la secondo è l’installer relativo al processo vero e proprio.
Impostiamo i campi dell’oggetto serviceProcessInstaller1:
·
Parent: è il nome della classe di tipo System.Configuration.Install.Installer che
contiene il serviceInstaller
·
Account: il tipo di “privilegio” che avrà il nostro
processo. Sono 4 i tipi:
o LocalService:
Utente con i più bassi privilegi
o NetworkService:
Medio privilegio
o LocalSystem:
Utente coi più alti privilegi
o User: Avvio
del servizio con un utente in particolare
Per il
nostro esempio, scegliamo il secondo, quindi this.serviceProcessInstaller1.Account
= System.ServiceProcess.ServiceAccount.LocalSystem;
Impostiamo invece quelli dell’oggetto serviceInstaller1:
·
L’unico campo rilevante è il ServiceName, ovvero il
nome del nostro servizio, quello che comparirà tra i servizi del tool mmc.exe
Adesso che il nostro servizio base è impostato, aggiungiamo
un qualcosa che ci dice che il nostro servizio funziona, altrimenti lo vedremo
con lo stato “in esecuzione” non trovando nessuna evidenza del fatto che stia
funzionando
APPLICAZIONE: AGGIUNTA DI UN TIMER
Aggiungiamo una proprietà di tipo System.Timers.Timer alla nostra
classe relativa al servizio.
Facendo un override del metodo OnStart(string[] args), che
verrà eseguito non appena viene avviato il processo, aggiungiamo il codice dove
inizializziamo il nostro timer:
protected override void OnStart(string[] args)
{
timer1 = new Timer(5000);
timer1.Elapsed += Tick;
timer1.Enabled = true;
timer1.Start();
}
Il nostro è quindi partito, eseguendo il metodo Tick ogni
5000 millisecondi.
Nel metodo Tick metteremo del codice che scrive un file di
testo nella root del nostro hard disk. E’ importante che per fare questo, il
tipo di servizio venga lanciato coi privilegi di LocalSystem, come detto sopra.
Di seguito il metodo Tick:
protected override void Tick(object sender, ElapsedEventArgs e)
{
StreamWriter t = new StreamWriter("C:\\DMTService_log.txt", true);
t.WriteLine(DateTime.Now + "-evento
tick");
t.Close();
}
Adesso che il nostro servizio è pronto, compiliamo il tutto e
passiamo all’installazione del servizio.
INSTALLAZIONE DEL SERVIZIO
L’installazione del servizio verrà fatta col metodo
installutil.exe, un tool della piattaforma che troviamo nella directory della
nostra installazione .Net.
Per esempio, aprendo cmd.exe, scriviamo sulla console:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe
C:\Users\Alberto\Documents\DMTDocumentService\DMTDocumentService\bin\Release\DMTDocumentService.exe
A questo punto il servizio è installato e quindi basta andare
su Gestione Attività di Windows, tab Servizi, cercare il nostro servizio e
attivarlo.
Basta andare sulla root “C:\” e vedremo il file DMTService_log.txt
con il log che si aggiorna ogni 5 secondi.