如何通过与桌面交互的应用程序与Windows服务进行通信?
借助.Net,与服务进行交互的最佳方式是什么(即大多数任务栏应用程序如何与其服务器进行通信)。如果此方法也是跨平台的,那将是更可取的(在Mono中工作,所以我想远程处理已经退出了吗?)
编辑:
忘了提了,我们仍然必须在现场支持Windows 2000计算机,因此WCF和.Net 2.0之上的任何版本都将无法运行。
解决方案
回答
远程处理是一个选项,但它不是跨平台的。其他一些方法是使用命名管道,IPC或者内核事件。
回答
有趣的是,我要建议远程处理! Mono 1.0发行说明(由于缺少原始位置,因此来自archive.org)提到了System.Runtime.Remoting.dll作为受支持的库,但未提及已知问题。
如果远程处理不可用,那么我们可能必须实现自己的TCP消息框架协议。 Windows没有等效的UNIX域套接字在同一台计算机上进行通信。
回答
大多数具有GUI组件的服务都以命名用户身份运行,并被允许访问桌面。这使我们可以通过COM或者.NET进行访问,但只能在本地访问(除非我们想变得复杂)
就我个人而言,我在其跨平台的服务上打开一个普通的旧套接字,允许多个客户端,允许任何应用访问它,不依赖于为其打开Windows安全性,并允许以任何语言编写GUI我们喜欢(因为所有内容都支持套接字)。
对于任务栏应用程序,我们希望使用一个简单的协议进行通信,也可以使用REST风格的系统向其发送命令,并向后传输XML(yuk)或者自定义数据格式。
回答
让服务在带有普通旧TCP流套接字的预定义端口上侦听127.0.0.1. 从桌面应用程序连接到该端口。
它非常简单,而且完全跨平台。
回答
请注意,如果我们打算最终在Windows Vista或者Windows Server 2008上进行部署,那么今天可以完成的许多方法将行不通。这是因为引入了一种称为"会话0隔离"的新安全功能。
大多数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/zh-cn/library/system.net.sockets.aspx
回答
如果这是一个托盘应用程序,而不是真正的服务,请当心使用管道或者TCP / IP时如何设置通信。如果有多个用户登录到计算机(Citrix,远程桌面),并且每个用户都启动了托盘应用程序"服务",则可能会遇到多个进程尝试使用相同的知名端口或者管道的情况。当然,如果我们不打算支持多个管道,或者我们拥有真正的服务而不是在每个用户外壳程序中运行的托盘应用程序,那么这不是问题。
回答
你们当中是否有人真的尝试过使用Mono进行远程处理?它工作正常。我们可能遇到一些极端情况,但这极不可能。只需不时测试跨平台(MS.Net <-> Mono)远程处理的应用程序即可发现任何可能的故障。从最近的Mono开始,目前是2.4.2.