2

我知道 IPC 并已在多个项目中使用它。我的新需求包括两个简单的 C# 应用程序,它们需要交换诸如“做这个”“做那个”之类的短消息。这应该是双向的。

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

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

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

4

2 回答 2

1

你有几个选择:

  • wcf,你说你已经考虑过并拒绝了;请问您拒绝的原因是什么?

  • 正如您所提到的,命名管道;将两个命名管道包装到双向消息传递系统中实际上是相当简单的(专业提示:使其一次性并清理管道,以免将它们锁定)

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

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

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

于 2013-01-10T18:45:32.903 回答
0

虽然你说 TCP 已经出...

我一直非常热衷于使用 ZeroMQ,但一直没有机会。它是带有 ac# 包装器的多平台,专为此类应用程序消息传递而设计。在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!" );
于 2013-01-10T18:51:57.237 回答