如何从与桌面交互的应用程序与Windows服务进行通信?

使用.Net与服务交互的最佳方式是什么(即大多数托盘应用程序如何与其服务器通信)。 如果这种方法也是跨平台的(在Mono中工作,那么我觉得远程处理已经出来了?)


编辑:

忘了提一下,我们仍然需要在现场支持Windows 2000机器,因此WCF和.Net 2.0以上的任何东西都不会飞。

请注意,如果您计划最终部署在Windows Vista或Windows Server 2008上,那么今天可以采用的许多方法都不起作用。 这是因为引入了一种名为“Session 0 Isolation”的新安全function。

现在,大多数Windows服务已被移动到会话0中运行,以便将它们与系统的其余部分正确隔离。 对此的扩展是,第一个登录系统的用户不再被放置在会话#0中,它们被放置在会话1中。因此,隔离将破坏在服务和桌面应用程序之间进行某些类型通信的代码。

在服务和应用程序之间进行通信时,今天编写适用于Vista和Server 2008的代码的最佳方法是使用正确的跨进程API,如RPC,命名管道等。不要使用SendMessage / PostMessage,因为这样做在会话0隔离下失败。

http://www.microsoft.com/whdc/system/vista/services.mspx

现在,根据您的要求,您将会陷入困境。 对于跨平台问题,我不确定是否支持Remoting。 你可能需要下载并一直回到套接字: http : //msdn.microsoft.com/en-us/library/system.net.sockets.aspx

如果这是托盘应用程序,而不是真正的服务,请注意在使用管道或TCP / IP时如何设置通信。 如果多个用户登录到计算机(Citrix,远程桌面),并且每个用户启动托盘应用程序“服务”,那么您可能会遇到多个进程尝试使用相同的已知端口或管道的情况。 当然,如果您不打算支持多个管道,或者如果您拥有真正的服务而不是在每个用户shell中运行的托盘应用程序,那么这不是问题。

让您的服务在具有普通旧TCP流套接字的预定义端口上侦听127.0.0.1。 从桌面应用程序连接到该端口。

这很简单,而且完全是跨平台的。

你们中的任何一个人真的尝试用Mono进行远程操作吗? 它工作得很好。 你可能碰到一些极端情况,但这种可能性很小。 只是测试您的应用程序的跨平台(MS.Net < - > Mono)远程处理,以捕捉任何可能的故障。 从最近的Mono开始,2.4.2是最新的。

远程处理是一种选择,但它不是跨平台的。 其他一些方法是使用命名管道,IPC或内核事件。

有趣的是,我打算建议Remoting! Mono 1.0发行说明 (来自archive.org,因为缺少原始位置)提到System.Runtime.Remoting.dll作为受支持的库,并没有说明已知问题。

如果远程处理已经完成,那么您可能必须实现自己的TCP消息成帧协议。 Windows没有相同的UNIX域套接字用于在同一台计算机上进行通信。

大多数具有GUI组件的服务都作为命名用户运行,并且允许访问桌面。 这允许您通过COM或.NET访问它,但只能在本地访问它(除非您想变得复杂)

就个人而言,我在服务上打开一个普通的旧套接字 – 它的跨平台,允许多个客户端,允许任何应用程序访问它,不依赖于Windows安全性为它打开,并允许您的GUI写入任何你喜欢的语言(因为一切都支持套接字)。

对于托盘应用程序,您需要一个simle协议进行通信 – 您也可以使用REST样式系统向其发送命令,并回送XML(yuk)或自定义数据格式。