2009-12-30 74 views
5

我已经使用c#2005.创建并启动了Windows服务Service1(以exe作为MyService.exe)。 我已经包含一个方法GetMyRandomNumber(),它返回一个随机double值。如何从运行Windows服务调用方法

这里的问题是如何使用这个正在运行的服务,我怎样才能调用该方法。

我曾尝试加入MyService.exe的参考和访问方法 -

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

但发现该方法不从服务的运行实例叫即即使我停止服务的声明被执行。

有人能解释我怎样才能从运行该服务的实例调用方法。

感谢您分享宝贵的时间。

回答

14

在代码中,你实际上并没有调用服务,而不是您正在引用可执行文件和invok从该程序集中创建一个方法(在运行时,.NET Framework将使用本地程序集来执行代码,而不是您正在运行的服务)。

要做你想做的事,你有很多选择。

在.NET 2.0中,您将使用.NET Remoting。您创建了远程处理接口,其他程序集可以使用这些接口来跨可执行文件调用方法。

在.NET 3.0中,远程处理已由WCF取代。您的服务将成为一个WCF服务,它将公开GetRandomNumber()作为其数据合同的一部分。应用程序可以使用合同并连接到您的服务来调用该方法。

对于.NET Remoting或其替代品Windows Communication Foundation,Web上有许多优秀的教程。

+2

如果在.NET 3.0+上,WCF将是这种情况下的正确选择。为了完整起见,我想补充一点,尽管WCF几乎在所有情况下都替换了Remoting,但它仍然具有跨AppDomain通信的优势 - 我不会使用WCF通过AppDomain边界进行通信,但在其他所有情况下,WCF都是正确的选择。 – 2009-12-30 08:49:42

2

与正在运行的服务进行通信与在任何其他正在运行的进程上调用方法没有区别。这意味着您需要挖掘标准工具以进行流程间通信。

Windows Communication Foundation(WCF)将是我的默认选择。您可以在Windows服务中托管WCF服务,并通过命名管道端点将其公开,以实现有效通信。

2

WCF将在同一台计算机上进行通讯的矫枉过正。 Pipes是一个更简单,更有效的解决方案。

+1

WCF可以使用命名管道。 http://msdn.microsoft.com/en-us/library/ms733769.aspx – 2009-12-30 08:18:49

+2

他正在使用C#2005(.Net 2.0?),因此WCF不是一个选项。 – Giorgi 2009-12-30 08:23:46

+1

良好的观察。我没有注意到这一点。 – 2009-12-30 08:31:23