在 Windows 服务上调用公共方法

Posted

技术标签:

【中文标题】在 Windows 服务上调用公共方法【英文标题】:Calling a public method on windows service 【发布时间】:2010-12-24 14:57:27 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

是的,这是可能的。

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

.NET Remoting 被视为旧技术,不建议用于新开发 (msdn.microsoft.com/en-us/library/72x4h507%28VS.85%29.aspx)。 Windows Communication Foundation (WCF) 是经过批准的执行此操作的方法。如果您不熟悉 WCF,请观看此视频 (dnrtv.com/default.aspx?showNum=135) 了解该技术的介绍。

以上是关于在 Windows 服务上调用公共方法的主要内容,如果未能解决你的问题,请参考以下文章

在Polymer中调用自定义元素/铁页面上的公共方法

jQuery - 小部件公共方法

初学者 C++ 程序上的 APPCRASH,调用函数的公共方法

如何在 Clojure 中调用公共类的非公共方法?

iOS:如何定义公共方法?

如何防止从特定类调用公共方法