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