2009-12-30 13 views
5

Ho creato e avviato il servizio Windows Service1 (con exe come MyService.exe) utilizzando C# 2005.. Ho incluso un metodo GetMyRandomNumber() che restituisce un doppio valore casuale.Come chiamare il metodo dall'esecuzione del servizio Windows

Il problema qui è come potrebbe utilizzare questo servizio in esecuzione e come potrei chiamare il metodo.

Ho provato ad aggiungere riferimento MyService.exe e accedere al metodo come -

Service1 s = new Service1(); 
MessageBox.Show(s.GetMyRandomNumber().ToString()); 

Ma trovato che il metodo non viene chiamato da l'istanza di servizio Per esempio, anche se arresto il servizio rendiconti sono eseguiti

Qualcuno potrebbe spiegarmi come posso chiamare il metodo dall'istanza in esecuzione del servizio.

Grazie per aver condiviso il vostro tempo prezioso.

risposta

14

Nel codice, non sono in realtà chiamare il servizio, invece stai facendo riferimento all'eseguibile e invok un metodo da quell'assembly (in fase di esecuzione .NET Framework utilizzerà un assembly locale per eseguire il codice, non il servizio in esecuzione).

Per fare quello che vuoi, hai un certo numero di opzioni.

In .NET 2.0, si farebbe uso di .NET Remoting. È possibile creare un'interfaccia di comunicazione remota, che può essere utilizzata da altri assembly per invocare metodi su file eseguibili.

In .NET 3.0, il servizio remoto è stato sostituito da WCF. Il servizio diventerebbe un servizio WCF, che esporrà il GetRandomNumber() come parte del suo contratto dati. Le applicazioni possono consumare il contratto e connettersi al servizio per chiamare il metodo.

Esistono numerosi tutorial validi sul Web sia per .NET Remoting che per la sua sostituzione, Windows Communication Foundation.

+2

+1 WCF sarebbe la scelta corretta in questo scenario se su .NET 3.0+. Per completezza vorrei aggiungere che sebbene WCF sostituisca i servizi remoti in quasi tutti i casi, ha ancora una nicchia per le comunicazioni cross-AppDomain - Non userei WCF per comunicare tra i confini di AppDomain, ma in tutti gli altri casi, WCF è la scelta giusta –

2

La comunicazione con un servizio in esecuzione non è diversa dal richiamo di metodi su qualsiasi altro processo in esecuzione. Ciò significa che dovrai scavare gli strumenti standard per le comunicazioni da processo a processo.

Windows Communication Foundation (WCF) sarebbe la mia scelta predefinita. È possibile ospitare un servizio WCF nel proprio servizio di Windows ed esporlo tramite un endpoint Named Pipe per comunicazioni efficienti.

2

WCF sarà un overkill per la comunicazione sullo stesso computer. Pipes è una soluzione più semplice ed efficace.

+1

WCF può utilizzare named pipe. http://msdn.microsoft.com/en-us/library/ms733769.aspx –

+2

Sta usando C# 2005 (.Net 2.0?) in modo che WCF non sia un'opzione. – Giorgi

+1

Buona osservazione. Non l'avevo notato. –

Problemi correlati