2009-12-30 16 views
5

J'ai créé et démarré Windows service Service1 (avec exe comme MyService.exe) en utilisant C# 2005.. J'ai inclus une méthode GetMyRandomNumber() qui retourne une double valeur aléatoire.Comment appeler la méthode depuis le service Windows

Le problème ici est comment pourrait utiliser ce service en cours d'exécution et comment pourrais-je appeler la méthode.

J'ai essayé d'ajouter une référence de MyService.exe et d'accéder à la méthode que -

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

mais a constaté que la méthode ne soit pas appelée à partir de l'instance en cours d'exécution du service-à-dire même si j'arrête le service des déclarations sont exécutés.

Quelqu'un pourrait-il me expliquer comment puis-je appeler la méthode de fonctionnement instance du service.

Merci de partager votre précieux temps.

Répondre

14

Dans votre code, vous n'êtes pas en fait le service appellent, au lieu vous référencez l'exécutable et invok une méthode de cet assembly (au moment de l'exécution, .NET Framework utilisera un assembly local pour exécuter le code, pas votre service en cours d'exécution).

Pour faire ce que vous voulez, vous avez un certain nombre d'options.

Dans .NET 2.0, vous utiliser .NET Remoting. Vous créez une interface distante que les autres assemblys peuvent utiliser pour appeler des méthodes sur des exécutables.

Dans .NET 3.0, l'accès distant a été remplacé par WCF. Votre service deviendrait un service WCF, ce qui exposerait le GetRandomNumber() dans le cadre de son contrat de données. Les applications peuvent consommer le contrat et se connecter à votre service pour appeler la méthode.

Il y a un certain nombre de bons tutoriels sur le web pour les .NET Remoting ou son remplacement, Windows Communication Foundation.

+2

+1 WCF serait le bon choix dans ce scénario si .NET 3.0+. Par souci d'exhaustivité, je voudrais ajouter que bien que WCF remplace Remoting dans presque tous les cas, il a toujours un créneau pour la communication inter-AppDomain - je n'utiliserais pas WCF pour communiquer à travers les frontières AppDomain, mais dans tous les autres cas, WCF est le bon choix. –

2

communiquer avec un service en cours d'exécution ne diffère pas d'invoquer des méthodes sur tout autre processus en cours d'exécution. Cela signifie que vous devrez extraire vos outils standard pour la communication processus-processus.

Windows Communication Foundation (WCF) serait mon choix par défaut. Vous pouvez héberger un service WCF dans votre service Windows et l'exposer via un point de terminaison Pipe nommé pour une communication efficace.

2

WCF sera une surpêche pour la communication sur le même ordinateur. Pipes est une solution plus simple et plus efficace.

+1

WCF peut utiliser des canaux nommés. http://msdn.microsoft.com/en-us/library/ms733769.aspx –

+2

Il utilise C# 2005 (.Net 2.0?) donc WCF n'est pas une option. – Giorgi

+1

Bonne observation. Je n'avais pas remarqué ça. –

Questions connexes