我在 Windows 服务(.NET C#)中有一个计时器。我需要能够从外部程序更改经过的值。如果计时器当前正在运行,我需要能够从外部程序缩短经过时间的值。我正在考虑在服务中使用一个公共方法来更改计时器经过的值并重新启动计时器,但是外部程序可以在 Windows 服务上调用公共方法吗?
4 回答
简而言之,不可能直接调用另一个进程中的函数。包含您要访问的功能的进程(在本例中为您的 Windows 服务)将需要通过某种 IPC(进程间通信)公开它。您选择哪种类型的 IPC 可能取决于通信需要的复杂程度,以及“客户端”是否是 .NET 应用程序。
如果您的需求很简单(例如只设置一个计时器值),或者如果您的客户端不使用 .NET,则使用命名管道(或 TCP,如果您需要从另一台物理机器访问服务)可能是您最好的选择。命名管道和 TCP 都为您提供了一个 Stream,您可以将消息写入并在另一端读取。
如果您需要公开许多不同的功能或发送和接收复杂的数据类型,并且如果您在两端都使用 .NET,那么 .NET Remoting 或 WCF 可能是最好的。.NET Remoting 更简单但有更多限制;WCF 非常灵活,但学习曲线更陡峭。
是的,这是可能的。
您可能需要考虑在您的服务上创建一个 NetNamedPipe 端点并通过该接口控制服务。
NetNamedPipeBinding binding = new NetNamedPipeBinding();
MyService myService = new MyService(binding,
new EndpointAddress("net.pipe://localhost/MyService"));
myService.ResetTimer(30);
不能直接调用 Windows 服务进程中的方法,但可以让 Windows 服务将此函数公开为 WCF 服务等。Windows 服务也将充当服务主机。这是可能的,并不复杂。
较旧的(非 WCF)服务可以使用 .NET Remoting。在这里查看有关如何开始的一些信息。这是跨进程边界的应用程序之间通信的 pre-WCF 方式。