Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

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.

© 2020 Carlo Vecchio
Torna ai contenuti