C#应用程序之间的双向IPC

时间:2013-01-10 18:35:22

标签: c# winforms .net-3.5

我知道IPC,并在几个项目中使用过它。我的新要求包括两个简单的C#应用​​程序,需要交换短消息,如“执行此操作”“完成”。这应该是双向的。

这将在旧系统(Win Xp .Net 3.5)上运行,但无法配置它们。最终用户只需运行该应用程序。

  • WCF对于此任务来说太复杂了
  • TCP上的套接字需要防火墙配置,可能会被阻止来自防病毒软件
  • Microsoft消息队列非常适合但需要在所有客户端上安装MSMQ
  • 可以使用命名管道,但我想要更高级别的东西(我觉得使用它们组装)

有没有一种简单的方法在C#应用程序之间交换数据?

2 个答案:

答案 0 :(得分:1)

你有几个选择:

  • wcf,你说你已经考虑过并拒绝了;我可以询问是什么让你拒绝它吗?

  • 如你所说,命名管道;将两个命名管道包装成双向消息传递系统实际上是微不足道的(专业提示:使其处于一次性状态并清理管道中的管道,以免将其锁定)

  • 排队系统,但通常您会在多对多或一对多渠道中看到这些

  • 序列化消息队列(简单队列结构)并将其放入内存映射文件,然后从任意一侧读/写

  • 深奥:使用Windows消息,即pinvoke发送/发布消息

答案 1 :(得分:0)

虽然你说TCP已经出局了......

我非常热衷于使用ZeroMQ,但却没有机会。它是一个带有c#包装器的多平台,专为这种应用程序消息传递而设计。在http://www.zeromq.org/查看ZeroMQ。

来自其中一个网站的一些示例代码:

// Set up a publisher.

var publisher = new ZmqPublishSocket {
    Identity = Guid.NewGuid().ToByteArray(),
    RecoverySeconds = 10
};

publisher.Bind( address: "tcp://127.0.0.1:9292" );

// Set up a subscriber.

var subscriber = new ZmqSubscribeSocket();

subscriber.Connect( address: "tcp://127.0.0.1:9292" );

subscriber.Subscribe( prefix: "" ); // subscribe to all messages

// Add a handler to the subscriber's OnReceive event

subscriber.OnReceive += () => {

    String message;
    subscriber.Receive( out message, nonblocking: true );

    Console.WriteLine( message );
};

// Publish a message to all subscribers.

publisher.Send( "Hello world!" );