Newsgroup: it.comp.dotnet
Titolo: come si testa un windows service ?

Salve a tutti
 
sto realizzando un windows service che ogni N minuti compie una certa 
operazione.
Come posso eseguire i test senza dover ricompilare il tutto, arrestare e 
disinstallare la versione precedente e rieseguire il setup ?
insomma se compilo e non mi segnala errori come faccio a sapere cosa non 
va a runtime ?
 
grazie per la pazienza

 runtime ?
 
tipicamente si realizza una soluzione con 3 progetti:
 
a) una dll con tutta la logica di business;
b) un progetto per hostare la dll in un servizoo per windows, che altro 
non fa che avviare un nuovo thread in cui eseguire la logica di "a";
c) un progetto console che fa la stessa cosa di "b" ma rende semplice 
il debug;
 
.m
 
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
 
blog @ 
http://milestone.topics.it
 
whynot [ at ] topics [ dot ] it
 
 

 .m
 
+1 quella strategia è fondamentale per evitare di diventare pazzi :)
 
Se però poi serve debuggare proprio il processo del servizio ci sono 
almeno due strategie:
- usare la classe Trace per sparare stringhe diagnostiche (grazie ad un 
apposito tracelistener ed eventuali traceswitch)
 
- usare "attach process" di 
vs.net
 per debuggare il servizio che sta 
già girando. In questo caso sarà necessario che 
vs.net
 venga avviato 
come administrator altrimenti non avrà i privilegi per poter fare 
l'attach di un processo che gira con credenziali differenti dall'utente 
loggato.
 
-- 
Raffaele Rialdi  
http://www.iamraf.net
 
Weblog: 
http://blogs.ugidotnet.org/raffaele
 
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
 
UGIdotNET - 
http://www.ugidotnet.org/
 
 
 

 processo che gira con credenziali differenti dall'utente loggato.
 
Aggiungo una porcata che ti permette di debuggare la OnStart, se 
proprio devi:
 
while( !Debugger.IsAttached )
{
  Thread.Sleep( 1000 );
}
 
in questo modo hai un tempo sufficiente per agganciare il processo 
appena avviato prima che il sistema operativo ti falci per timeout in 
fase di avvio.



 
:)
anche se comunque dentro la onstart sarebbe meglio fare il meno 
possibile anche per evitare di rischiare il timeout sulla partenza del 
servizio o di rallentare la macchina al boot.
 
Di solito si lancia un thread che poi attende qualche sorta di evento 
dall'esterno per iniziare a fare quello che deve.


 +1 quella strategia è fondamentale per evitare di diventare pazzi :)
 
+2 :)
 
Il caso vuole che proprio oggi litigo con un servizio win!
 
Al3x

 Al3x
 
ciao Al3x
tu come stai procedendo ?
Ad essere sincero non ho chiaro come realizzare il punto b e c.
Hai qualche suggerimento ?
 
 

 Hai qualche suggerimento ?
 
//punto A
public class MioServizioStrabello
{
	public MioServizioStrabello() { ... }
	public void Start()
	{
		//qui fai lo start del servizio
	}
	public void Stop()
	{
		//qui fai lo stop del servizio
	}
}
 
//punto B
public classe MioServizioStrabelloService : ServiceBase
{
	protected MioServizioStrabello service;
	public MioServizioStrabelloService(MioServizioStrabello mss)
	{
		this.service = mss;
	}
 
	public override void OnStart(string[] args)
	{
		new Thread(new ThreadStart(() => this.service.Start())).Start();
	}
	public override void OnStop() { this.service.Stop(); }
}
 
//punto C
//eseguendo in debug questa console app puoi debuggare il servizio
public class Program {
	public static void Main(string[] args)
	{
		var service = new MioServizioStrabello();
		service.Start();
		Console.ReadLine();
	}
}
 
ho scritto il codice di volata, senza syntax checker e senza testarlo.
Quindi *ovviamente* non funziona. :-) Ma spero possa essere un buon 
punto di partenza.
 
Buon lavoro e facci sapere come va,
Giulio
 
-- 
 


grazie Giulio, volentieri ! postero' l'esito
:-)
 
 

 punto di partenza.
 
scusa Giulio, ho VS2005 e var service = new MioServizioStrabello(); non 
lo accetta.
di che tipo e' la variabile service , di tipo ServiceBase ?
 
grazie e ciao
 


 
scusate,  ho il seguente codice per fare una app da console  ma non me 
lo fa compilare e mi dice che
"Errore	1	Il tipo o il nome dello spazio dei nomi 'ServiceProcess' non 
esiste nello spazio dei nomi 'System'; probabilmente manca un 
riferimento a un assembly"
 
**************
 
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
 
 
namespace debaco
{
     class Program
     {
         public static void Main(string[] args)
         {
             ServiceBase service = new mioServizio();
             service.Start();
             Console.ReadLine();
         }
     }
}
**************
 
cosa sbaglio ?

 di che tipo e' la variabile service , di tipo ServiceBase ?
 
La variabile 'service' è di tipo MioServizioStrabello... ma la puoi 
dichiarare come istanza di una qualsiasi superclasse, a seconda delle 
esigenze. Per l'esempio postato, puoi tranquillamente dichiararla come 
MioServizioStrabello.
Se non ricordo male "var" è una "novità" introdotta dal framework 3.5, 
non so se VS2005 lo supporti.
 
Ciqo,
Giulio
 
-- 
 

 cosa sbaglio ?
 
 
Hai importato la libreria system.serviceprocess.dll?
 
Ciao,
Giulio
 
--