C# - Creare un Servizio Windows
C#
Codice del progetto
- In Visual Studio, creare un nuovo progetto. Selezionare ‘Windows Service’ e indicare il nome del progetto. Confermare con ‘OK’.
- Una volta creato il progetto, viene mostrato il design del file ‘Service1.cs’. Un link presente sul design stesso permette di visualizzare il codice. Il nome del file e il nome della classe possono essere ovviamente modificati.
- Il codice presenta due eventi: ‘OnStart()’ e ‘OnStop()’.
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
- Aggiungere al progetto una o più classi per contenere la logica del progetto. In questo esempio si aggiunge la classe ‘Logic.cs’ pubblica e statica.
- È buona regola aggiungere un metodo per scrivere un file che faccia da ‘Trace’ del servizio. In questo modo si può controllare se il servizio ha lavorato correttamente e le eventuali eccezioni. Il metodo ‘WriteLog()’, nella classe ‘Logic’ è il seguente:
public static void WriteLog(string message)
{
try
{
using (StreamWriter sw =
new StreamWriter(AppDomain.CurrentDomain.BaseDirectory
+ @'\log.txt', true))
{
sw.WriteLine(DateTime.Now.ToString('yyyy/MM/dd hh:mm:ss') + ' ' + message);
}
}
catch
{
}
}
- Spesso il servizio deve eseguire del codice ripetutamente; è comodo allora utilizzare un Timer. Nella classe ‘Service1’ si definisce un Timer che viene attivato nell’evento OnStart() e disattivato nell’evento OnStop().
public partial class Service1 : ServiceBase
{
// Necessita di using System.Timers
private Timer tmr = null;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
tmr = new Timer();
tmr.Interval = 10000;
tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
tmr.Enabled = true;
Logic.WriteLog("Timer attivato.");
}
void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
Logic.WriteLog("Evento timer.");
}
protected override void OnStop()
{
tmr.Enabled = false;
Logic.WriteLog("Timer disattivato.");
}
}
- Il progetto appena fatto non può essere eseguito dall’ambiente di sviluppo (se si prova, si ottiene un messaggio esplicativo).
- Per avviare il Servizio, occorre prima compilarlo e installarlo.
Compilare il Servizio
- Per compilare il Servizio:
- Nella finestra di design del file ‘Service1.cs’, fare un click destro.
- Nel menu contestuale, fare click su ‘Add Installer’.
- Il sistema genera il file ‘ProjectInstaller.cs’ che contiene i due oggetti ‘serviceProcessInstaller1’ e ‘serviceInstaller1’.
- Modificare le seguenti proprietà dell’oggetto ‘serviceInstaller1’: ‘ServiceName’ (il nome scelto è quello che viene visualizzato nella finestra dei servizi Windows), ‘Description’ (la descrizione scelta è quella che viene visualizzata nella finestra dei servizi Windows) e ‘StartType’ (Manuale, Automatico, Disabilitato).
- Modificare la seguente proprietà dell’oggetto ‘serviceProcessInstaller1’: ‘Account’ in ‘LocalSystem’.
- Eseguire la compilazione del progetto e localizzare il file eseguibile.
Installare / Disinstallare il Servizio (nella macchina di sviluppo)
- Per installare il Servizio:
- Avviare il prompt di Visual Studio (Programmi -> Visual Studio -> Visual Studio Tools -> Developer Command Prompt for Visual Studio).
- Spostarsi con i comandi DOS nella cartella dove c’è l’eseguibile del servizio creato.
- Eseguire il comando ‘InstallUtil.exe nome_file_eseguibile’.
- Verificare dai messaggi sul prompt se l’installazione è avvenuta correttamente.
- In caso di errore “System.Security.SecurityException: Origine non trovata, ma non è stato possibile eseguire la ricerca in uno o più log eventi. Log non accessibili: Security.” provare ad aprire il prompt come amministratore.
- Per disinstallare il Servizio:
- Stessi passaggi dell’installazione tranne il comando da dare che è: ‘InstallUtil.exe /u nome_file_eseguibile’.
- Se sono fatte delle modifiche al software, il servizio deve essere fermato, disinstallato e poi reinstallato.
Start / Stop del Servizio
- Per installare il Servizio:
- Aprire i servizi di Windows (eseguire ‘services.msc’).
- Localizzare il servizio in base al nome dato durante la fase di compilazione.
- Avviare o fermare il servizio a proprio piacimento.
Debug del codice
- Un servizio è un software che non ha una interfaccia grafica ed è gestito dal Sistema Operativo. Questo rende difficoltoso ma non impossibile il debug. Infatti per fare il debug ci viene incontro il Visual Studio.
- Per eseguire il debug del servizio:
- Compilare il servizio in modalità ‘debug’.
- Installare il servizio.
- Avviare il servizio.
- Avviare Visual Studio con credenziali amministrative.
- Menu di Visual Studio: Strumenti -> Opzioni, selezionare la voce Debug -> Simboli, scegliere la casella di controllo ‘Server dei simboli Microsoft’ e poi confermare con OK.
- Menu di Visual Studio: Debug -> Connetti a processo; selezionare la check box “Mostra processi di tutti gli utenti”, selezionare il servizio e poi Connetti.
- Adesso si può fare il debug con i tradizionali breakpoint.
- Per fermare il debug è sufficiente arrestare il servizio.
- Non è possibile eseguire il debug dei metodi OnStart() e Main().
- Nel caso si debba fare qualche correzione al codice, non si può ricompilare con il servizio avviato. Quindi occorre fermare il servizio, ricompilare e infine avviare nuovamente il servizio.
Installare / Disinstallare il Servizio (in altra macchina)
- Una volta creato il servizio, occorre installarlo in uno o più PC.
- I servizi sono localizzati nel Registro di Sistema (per avviarlo eseguire il programma “regedit.exe”). Il percorso completo delle chiavi di registro è: “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\”. Ogni servizio è identificabile tramite il suo “Nome” che può essere diverso dal nome del file eseguibile.
- L’utility per installare / disinstallare / configurare servizi è “sc.exe”, programma presente in C:\Windows\System32.
- Per installare un servizio:
- Prompt dei comandi (come amministratore).
- Dare il comando: sc.exe create nome_servizio type= own start= auto binPath= path_del_servizio
- Per disinstallare un servizio:
- Prompt dei comandi (come amministratore).
- Dare il comando: sc.exe delete nome_servizio
- Attenzione:
- Nei parametri dei comandi, è obbligatorio inserire uno spazio dopo il segno di uguale ‘=’.
- Non tutti i programmi possono essere lanciati come servizi, per esempio provando con gli Accessori Windows Calcolatrice e Paint, il servizio apparirà correttamente installato ma non si avvierà. Programmi utilizzabili come servizi possono essere creati per esempio con Visual Studio.