2009-12-08 26 views
6

Ho un timer in un servizio Windows (.NET C#). Devo essere in grado di cambiare il valore trascorso da un programma esterno. Se il timer è attualmente in esecuzione, devo essere in grado di ridurre il valore di tempo trascorso da un programma esterno. Stavo pensando di avere un metodo pubblico nel servizio che cambierebbe il valore trascorso del timer e riavvia il timer, ma un programma esterno può chiamare un metodo pubblico su un servizio Windows?Chiamare un metodo pubblico sul servizio Windows

risposta

8

In breve, non è possibile chiamare direttamente le funzioni in un altro processo. Il processo che contiene la funzione a cui si desidera accedere (in questo caso, il servizio di Windows) dovrà esporlo tramite una sorta di IPC (comunicazione tra processi). Quale tipo di IPC scelto dipenderà probabilmente dalla complessità della comunicazione e dal fatto che il "client" sia un'applicazione .NET.

Se le vostre esigenze sono semplici (ad esempio, l'impostazione di un valore del timer) o se il client non utilizza .NET, l'uso di named pipe (o TCP, se è necessario accedere al servizio da un'altra macchina fisica) è probabilmente il vostro migliore scommessa. Sia named pipe e TCP ti danno un flusso che è possibile scrivere messaggi e leggere dall'altra parte.

Se è necessario esporre molte funzioni diverse o inviare e ricevere tipi di dati complessi e se si utilizza .NET su entrambe le estremità, .NET Remoting o WCF è probabilmente la scelta migliore. .NET Remoting è più semplice ma ha più vincoli; WCF è molto flessibile ma ha una curva di apprendimento più ripida.

+1

.NET Remoting è considerato una tecnologia legacy e non è consigliato per il nuovo sviluppo (http://msdn.microsoft.com/en-us/library/72x4h507%28VS.85% 29.aspx). Windows Communication Foundation (WCF) è il modo approvato per farlo. Se non hai familiarità con WCF, guarda questo video (http://www.dnrtv.com/default.aspx?showNum=135) per un'introduzione alla tecnologia. –

4

Non è possibile chiamare direttamente un metodo in un processo di servizio Windows, ma è possibile che il servizio Windows esponga questa funzione come servizio WCF, ad esempio. Il servizio Windows agirà anche da host di servizio. Questo è possibile e non complicato.

5

Sì, questo è possibile.

È possibile considerare di creare un endpoint NetNamedPipe sul proprio servizio e controllare il servizio tramite tale interfaccia.

NetNamedPipeBinding binding = new NetNamedPipeBinding(); 
MyService myService = new MyService(binding, 
       new EndpointAddress("net.pipe://localhost/MyService")); 
myService.ResetTimer(30); 
+0

MyService non sta prendendo 2 strumenti .. –

2

I servizi meno recenti (non WCF) possono utilizzare .NET Remoting. Date un'occhiata a here per alcune informazioni su come iniziare. Questo è il modo di comunicazione pre-WCF tra le applicazioni oltre i limiti del processo.

Problemi correlati