在Windows服务上调用公共方法

时间:2009-12-08 22:15:57

标签: c# .net windows-services timer public-method

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

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:5)

是的,这是可能的。

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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