简单的跨平台流程来处理Mono中的通信?

Dou*_*ank 11 c# mono ipc

我正在开发一个可在Linux,Mac和Windows上运行的Mono应用程序,并且需要应用程序(在单个操作系统上)才能相互发送简单的字符串消息.

具体来说,我想要一个单实例应用程序.如果尝试启动第二个实例,它将向已经运行的单个实例发送消息.

DBus已经出局了,因为我不希望这是一个额外的要求.套接字通信似乎很难,因为Windows似乎不允许连接权限.Mono似乎不支持内存映射文件.Mono似乎不支持命名管道.似乎在Mono上不支持IPC.

那么,是否有一种简单的方法可以将单个计算机上的字符串消息发送到适用于每个操作系统的服务器应用程序,而无需权限或其他依赖项?

ser*_*nko 5

在我的ubuntu(单声道版本10.10:2.6.7)上,我尝试使用WCF与BasicHttpBinding,NetTcpBinding和NetNamedPipeBinding进行进程间通信。前2个工作正常,对于NetNamedPipeBinding我收到一个错误:

不支持频道类型IDuplexSessionChannel

调用ChannelFactory.CreateChannel()方法时。

我还尝试将Remoting(自WCF推出以来就是一项旧技术)与IpcChannel结合使用;此msdn页上的示例已启动,并且在我的计算机上正常运行。

我想您在Windows上使用WCF或Remoting也不应该有问题,尽管不确定Mac,也没有要测试的东西。让我知道您是否需要任何代码示例。

希望这会有所帮助,问候


Edw*_*vey 3

我在 mono-dev 邮件列表上写了相关内容。考虑了几种通用的进程间消息传递系统,包括 DBus、System.Threading.Mutex 类、WCF、Remoting、命名管道...结论基本上是mono 不支持 Mutex 类(适用于线程间,不适用于线程间)对于进程间)并且没有任何平台无关的可用

我只能想象三种可能的解决方案。都有其缺点。也许有更好的解决方案可用,或者可能只是针对特定目的的更好的解决方案,或者可能存在一些跨平台的第三方库,您可以将其包含在您的应用程序中(我不知道。)但这些是我见过的最好的解决方案到目前为止能够找到:

  • 使用独占锁在已知位置打开或创建文件。(文件共享。无)。每个应用程序都会尝试打开文件、执行其工作并关闭文件。如果无法打开,请Thread.Sleep(1)并重试。这是一种贫民窟,但它可以跨平台工作以提供进程间互斥。
  • 插座。第一个应用程序在本地主机上侦听一些高编号端口。第二个应用程序尝试侦听该端口,但无法打开(因为其他进程已经拥有该端口),因此第二个进程向第一个进程发送一条消息,该进程已经在该端口上侦听。
  • 如果您有权访问事务数据库或消息传递系统(sqs、rabbitmq 等),请使用它。
  • 当然,您可以检测您所在的平台,然后使用该平台上可用的任何内容。