2009-12-08 207 views
6

我在Windows服务(.NET C#)中有一个计时器。我需要能够从外部程序中更改经过的值。如果定时器当前正在运行,我需要能够缩短来自外部程序的时间经过值。我正在考虑在服务中使用一个公共方法来改变计时器的过期值并重新启动计时器,但是外部程序是否可以在Windows服务上调用公共方法?调用Windows服务的公共方法

回答

8

总之,不可能在另一个进程中直接调用函数。包含您想要访问的函数(在本例中为Windows服务)的进程需要通过某种IPC(进程间通信)来公开它。您选择哪种类型的IPC可能取决于通信的复杂程度以及“客户端”是否为.NET应用程序。

如果您的需求很简单(例如只设置一个计时器值),或者如果您的客户端不使用.NET,那么使用命名管道(或TCP,如果您需要从另一台物理机器访问服务)最好的选择。命名管道和TCP都为您提供了一个Stream,您可以将消息写入另一端并在其上读取。

如果您需要公开许多不同的函数或发送和接收复杂的数据类型,并且如果您在两端都使用.NET,.NET Remoting或WCF可能是最好的。 .NET Remoting更简单,但有更多的限制; WCF非常灵活,但学习曲线陡峭。

+1

.NET Remoting被认为是传统技术,不建议用于新开发(http://msdn.microsoft.com/zh-cn/library/72x4h507%28VS.85% 29.aspx)。 Windows Communication Foundation(WCF)是批准的方式。如果您不熟悉WCF,请观看此视频(http://www.dnrtv.com/default.aspx?showNum=135)以获取该技术的介绍。 – 2009-12-09 14:38:29

4

您不能直接在Windows服务进程中调用方法,但可以让Windows服务将此函数作为WCF服务公开。 Windows服务也将充当服务主机。这是可能的,并不复杂。

5

是的,这是可能的。

您可能需要考虑在您的服务上创建NetNamedPipe端点并通过该接口控制服务。

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

MyService未使用2个参数.. – 2013-11-21 06:40:22

2

旧的(非WCF)服务可以使用.NET Remoting。有关如何开始的一些信息,请看看here。这是WCF之前的跨进程边界的应用程序之间进行通信的方式。