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

时间:2008-09-17 16:06:12

标签: c# .net windows-services service mono

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


编辑:

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

7 个答案:

答案 0 :(得分:17)

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

现在,大多数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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

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

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