使用 .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/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 或内核事件。

有趣的是,我打算建议远程处理!这 Mono 1.0 发行说明 (来自 archive.org,因为原始位置丢失)提及 System.Runtime.Remoting.dll 作为受支持的库,并且没有提及任何有关已知问题的信息。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top