2010-01-29 3 views
5

abbiamo un servizio Windows in esecuzione e abbiamo anche un'applicazione console che usiamo per configurare questo servizio, abbiamo anche un'opzione per vedere alcuni log registrati.Applicazione console per comunicare con un servizio Windows

La cosa molto brutta di questo è che questa comunicazione è fatta da un file di testo, l'app della console scrive su un file di testo e il servizio lo legge e viceversa.

Cosa useresti per questa comunicazione? TCP/IP non è un'opzione perché l'app della console verrà utilizzata solo per il servizio locale in esecuzione.

API Windows SendMessage dovrebbe essere la strada da percorrere?

grazie!

risposta

6

Vorrei raccomandare WCF come prima cosa da considerare per tutte le comunicazioni su Windows se si utilizza .net come costruito per questo tipo di cose e relativamente facile da usare. Dato che stai escludendo il TCP, ti suggerisco di usare lo Named Pipes Binding.

Ci sono anche un numero di apis di comunicazioni Windows disponibili per comunicazioni intra-macchina. Named Pipes (come detto), MailSlots, Shared Memory (Memory Mapped files) ecc.

Il mio suggerimento sarebbe stato utilizzare Named Pipe con WCF o nativamente.

0

Shared Memory? Vedere here per un articolo su Codeproject, ecco un altro articolo fastipc sullo stesso sito. C'è un post sul blog che spiega come utilizzare uno memory mapped file per la condivisione tramite un wrapper.

Spero che questo aiuti, Cordiali saluti, Tom.

1

Si corre meno rischi di deadlock se si utilizzano metodi non bloccanti per il trasferimento di messaggi. PostMessage o SendNotifyMessage sono migliori di SendMessage perché non bloccano il chiamante.

Ma dipendono dal servizio con una maniglia della finestra. Lo fa?

È inoltre possibile utilizzare il messaggio WM_COPYDATA per passare più di un wParam a lParam. Se si utilizza questo messaggio con PostMessage, è necessario fare attenzione a non liberare la memoria fino a quando il ricevitore non ha finito con esso. È più sicuro utilizzare SendMessage per WM_COPYDATA.

+0

+1 - Non sono sicuro di ciò che l'OP sta usando per la loro codifica, ma ho usato WM_COPYDATA PostMessage per le comunicazioni tra processi in passato. Se la memoria è assegnata a destra, la si imposta per il ricevitore per deallocarla sulla ricezione dei messaggi. Questo lo rende asincrono. – ChrisBD

+0

Si noti che l'approccio 'PostMessage' non riesce su Vista e in seguito in alcune circostanze a causa dell'isolamento della sessione 0 - vedere ad es. http://blogs.technet.com/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx –