PDA

View Full Version : [C#] Da Windows Form a Windows Service


TheMonzOne
14-02-2012, 13:29
Ciao a tutti!
Come da titolo quello che vorrei fare è trasformare una Desktop Application o meglio una Windows Form in un Servizio di Windows, in modo che possa operare come tale e girare su un server.
L'Applicazione sotto forma di Form è già completata (o quasi), come faccio a trasformarla in un Servizio di Windows?
Attualmente uso un piccolo "trucchetto", ovvero tramite ServerAny (http://marcellotonarelli.wordpress.com/2007/06/02/esecuzione-di-una-applicazione-come-servizio/) faccio lanciare al servizio creato l'eseguibile della mia applicazione che quindi gira a tutti gli effetti come fosse un servizio.
Vorrei però fare a meno di ServerAny e creare di mio il servizio.

Una volta riuscito a fare quello, poi, dovrei trovare il modo di "monitorare" e gestire l'applicazione che, girando come servizio, non ha ovviamente GUI, quindi tutte le opzioni gestibili mediante la Form spariscono. C'è un modo semplice per farlo?
Per ora ho creato una semplicissima "Interfaccia" utente che tramite le socket non fa altro che mostrare i messaggi che arrivano sulla Form principale dentro una textarea. Qual è la struttura di controllo che mi permetterebbe di interagire con il servizio come se stessi usando la form nella sua forma Desktop?

Spero di aver espresso le mie necessità in modo chiaro, se dovesse servire posso postare anche piccole porzioni di codice per vedere come far interagire le varie strutture.

Grazie mille a tutti!

tomminno
14-02-2012, 17:47
Se hai strutturato a livelli la tua applicazione non dovresti avere particolari problemi ;)
Dovresti staccare l'interfaccia dalla logica applicativa e accettare comandi tramite socket che sostituiscono il comando impartito da interfaccia.
I risultati poi potresti visualizzarli tramite la stessa interfaccia che hai implementato adesso.
Questo sempre tutto in teoria, se invece hai la logica strettamente legata all'interfaccia sei nei guai!

TheMonzOne
14-02-2012, 19:13
Se hai strutturato a livelli la tua applicazione non dovresti avere particolari problemi ;)
Dovresti staccare l'interfaccia dalla logica applicativa e accettare comandi tramite socket che sostituiscono il comando impartito da interfaccia.
I risultati poi potresti visualizzarli tramite la stessa interfaccia che hai implementato adesso.
Questo sempre tutto in teoria, se invece hai la logica strettamente legata all'interfaccia sei nei guai!Temo di essere nei guai allora :D .
Grazie per la risposta innanzi tutto...tu come suggeriresti di procedere? Non sarebbe nemmeno troppo impensabile riscrivere anche l'applicazione...non dico da zero...ma quasi...alla fine la GUI è più che altro di "visualizzazione" e interrogazione...piuttosto non riesco a capire come potrei gestire variabili e strutture dall'esterno dell'applicazione. :confused:
Esplico: l'applicazione è una sorta di gateway di ricezione per la comunicazione con alcuni dispositivi remoti che si connettono via UDP e vengono registrati/interrogati/gestiti dal gateway...come faccio, ad esempio, ad estrapolare la lista dei dispositivi connessi ( nella fattispecie una ArrayList ) per pilotarli poi dall'eventuale interfaccia esterna?
Scusate se la cosa sembra banale, ma non ho molta esperienza a questi livelli...fin'ora ho fatto sempre e solo desktop application con una GUI standard....

tomminno
14-02-2012, 23:39
Temo di essere nei guai allora :D .


Lo supponevo :D


Esplico: l'applicazione è una sorta di gateway di ricezione per la comunicazione con alcuni dispositivi remoti che si connettono via UDP e vengono registrati/interrogati/gestiti dal gateway...come faccio, ad esempio, ad estrapolare la lista dei dispositivi connessi ( nella fattispecie una ArrayList ) per pilotarli poi dall'eventuale interfaccia esterna?


Direi come fai adesso! :stordita:
Supponiamo che il servizio faccia un autodiscovery dei dispositivi, avrà al suo interno una struttura dati che tiene traccia dello stato dei dispositivi es List<ConnectedDevice>.
Dovrai pensare ad un comando di GetConnectedDevices esposto dal servizio che l'interfaccia richiamerà per ottenere la lista e poi visualizzarla.
Se l'interfaccia dovesse interagire con i dispositivi potresti prevedere un comando SendCommand che il servizio interpreterà e girerà al dispositivo selezionato secondo il protocollo di comunicazione di quest'ultimo.

Se lo dovessi realizzare io userei Wcf con binding net.tcp integrandole nel servizio windows: http://msdn.microsoft.com/en-us/library/ff649818.aspx
Non hai bisogno di perdere il capo dietro socket e protocolli di comunicazione custom. E' facilmente espandibile ed estremamente potente.
Se mai dovesse essere il caso con le Wcf potresti pure esporre il tuo servizio (magari pure con protocollo soap) all'interno della rete e consentire una interrogazione remota, il tutto aggiungendo delle configurazioni e senza aggiungere una riga di codice.

La chiamata da parte della tua GUI risulterebbe estremamente banale, una semplice service reference e sei pronto ad interrogare il tuo servizio!

TheMonzOne
15-02-2012, 08:07
La fai facile tu :D , mai vista quella roba...fortuna che c'è una montagna di documentazione.
Ok, ci provo...ci risentiamo tra un paio d'anni :sofico: .

Grazie per ora!

tomminno
15-02-2012, 09:58
La fai facile tu :D , mai vista quella roba...fortuna che c'è una montagna di documentazione.
Ok, ci provo...ci risentiamo tra un paio d'anni :sofico: .

Grazie per ora!

Tranquillo che fai prima ad imparare ad usare Wcf che non a cercare di far funzionare una coppia di socket e ad inventare un protocollo per lo scambio dati!

TheMonzOne
15-02-2012, 10:24
C'è già il primo intoppo :D : seguendo passo passo la procedura su msdn, arrivato al punto 6, installo il servizio e tutto sembra andare a buon fine, ma quando vado ad avviarlo mi da un errore.
"Impossibile avviare il servizio Service1 su Computer Locale. Errore 5: accesso negato"

Lavoro su Windows 7 Ultimate 32bit, Account Amministratore

EDIT: risolto questo problema cambiando l'impostazione dell'account da "NetworkService" a "LocalSystem"...mi chiedo se vada bene lo stesso.
Ora cerco di capire come funzionano i metodi di passaggio....