Prima di .NET creare un servizio windows era una impresa da Titani della programmazione, o comunqe servivano molte conoscenze, ma con Visual Studio .NET abbiamo la possibilità in pochi minuti di creare un servizio windows.
Il seguente articolo spiega come creare un servizio windows che controlla l?esistenza di un file in una directory, e scrive un file di log. Il codice presentato nell?articolo è scritto in C#, ma l?allegato all?articolo contiene il progetto in C# e in VB.NET.
Pronti ?. Via!Diamo il nome al progetto ?sharpService?, scegliamo la directory del progetto e clicchiamo OK.
Il progetto contiene di default 2 file: AssemblyInfo.cs e Service1.cs che è il nostro servizio.
La selezione del tipo di progetto
Service1.csAnalizzando il codice che ci viene presentato in automatico da Visual Studio .NET troviamo i seguenti metodi:
public Service1(){} //Costruttore della classe
static void Main(){} //Main del progetto
private void InitializeComponent(){} //Metodo che inizializza i componeti del servizio
protected override void Dispose(){} //Metodo che ?pulisce? le risorse utilizzate
protected override void OnStart(){} //Metodo che viene scatenato all?avvio del servizio
protected override void OnStop(){} //Metodo scatenato allo stop del servizio
Di tutti questi metodi quelli che utilizzeremo sono
OnStart e
OnStop.
App.configCreiamo un file di configurazione con le variabili del nostro servizio. Per creare un file di configurazione posizionarsi sul solution explorer, tasto destro -> New item -> Application configuration file.
Creazione del File di Configurazione
All?interno del nostro file inseriamo le seguenti variabili:
<configuration>
<appSettings>
<!-- Path da controllare -->
<add key="strControlPath" value="C:\" />
<!-- File da controllarne l'esistenza -->
<add key="strEndCodeFile" value="test.xml" />
<!-- File di log -->
<add key="strLogFile" value="C:\log.txt" />
</appSettings>
</configuration>
Service1.csOra scriviamo il nostro servizio, prima importando i seguenti namspace:
System.IO : Per la scrittura del file di log
System.Configuration : Per leggere il file App.config
Ora dichiariamo il nostro timer, che ogni 5 secondi (o quanti ne volete), controllera l?esistenza del nostro file:
private System.Timers.Timer myTimer = new System.Timers.Timer(5000);
Inoltre dichiariamo anche tutte le alter variabili che abbiamo impostato nel file di configurazione. A questo punto dobbiamo creare un Handler sul timer per poter scatenare il metodo che controllerà l?esistenza del file.
this.myTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.myTimer_Elapsed);
Ora abbiamo il timer e un Handler dobbiamo creare il metodo che eseguirà le nostre operazioni
private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e){}
La funzione scatterà ogni 5 secondi (o il tempo che è stato deciso), ed eseguirà una serie di operazioni, nel nostro caso dovremo controllare l?esistenza di un file e di seguito aprire un file di testo e scrivere una linea di testo.
Metodo blnCheckExistsIl metodo controlla l?esistenza di un file. Per fare ciò creiamo un oggetto fileInfo, passando il parametro strFilePath, percorso del nostro file.
FileInfo myCheckFile = new FileInfo(strFilePath);
Ora con un semplice if controlliamo l?estenza del nostro file.
if (myCheckFile.Exists){}
Metodo writeTxtFileIl metodo scrive un messaggio all?interno di un file di testo, aggiungendo una riga ad ogni chiamata. Per poter scrivere un file di testo dobbiamo creare 2 oggetti:
FileStream : Per poter aprire il file di testo in lettura o scrittura
StreamWrite : Per poter scrivere la riga di testo ne file di log
public void writeTxtFile(string strMessage){
//Oggetto FileStream
myFileStream = new FileStream(strLogFile, FileMode.Append, FileAccess.Write, System.IO.FileShare.None);
//StreamWriter per scrivere il file di testo
System.IO.StreamWriter myWriter = new StreamWriter(myFileStream);
//Scrivo la linea nel file di log
myWriter.WriteLine(System.DateTime.Now.ToString() + " - " + strMessage);
//Chiudo gli oggetti
myWriter.Close();
myFileStream.Close();
}
Creazione dell'InstallerPer poter utilizzare il nostro servizio dobbiamo creare un ?installer?, l?installer non è altro che una classe che descrive le proprietà del nostro servizio. Per poter creare un installer bisogna posizionarsi sulla scermata di design del nostro servizio, tasto destro > Add Installer.
Aggiunta dell'Installer
A questo punto viene in automatico viene creato un file .cs con due componenti, il service procedure installer e il service installer.
Service Process Installer e il Service Installer
Il Service Process Installer ci permette di definire quale utente può far partire il servizio, da menu proprietà è possibile scegliere queste opzione. Mentra il Service Installer ci permette di decidere il metodo di start del servizio e il nome visualizzato nella consolle di gestione dei servizi.
Le Proprietà di Service Process Installer e del Service Installer
Come installare il servizioOra che abbiamo scritto il codice del nostro servizio non dobbiamo far altro che installarlo. Se cerchiamo di eseguire il servizio da Visual Studio .Net ci comparirà il seguente alert di errore.
E' Impossibile avviare un servizio da command line o da un debugger
Visual studio ci avverte che dobbiamo installare il servizio utilizzando l?utility
installUtil.exe, per far ciò dobbiamo aprire il prompt di visual studio dal menù programmi
Il prompt dei comandi di Visual Studio .NET
Una volta aperto il prompt bisogna posizionarsi nella directory bin del nostro progetto ed eseguire la nostra utilità con il seguente comando:
installUtil.exe [NomedelProgetto].exeA questo punto il nostro servizio è stato installato, e per vederne le proprietà basta andare nella consolle dei servizi di Windows.
Per
disinstallare il nostro servizio bisogna riaprire la consolle di prompt di Visual Studio .NET, posizionarsi nella directory bin del nostro progetto ed eseguire il seguente comando:
installUtil.exe /u [NomedelProgetto].exe