发送/接收消息到/从两个运行的应用程序

我有两个名为SENDER和RECEIVER的应用程序。

RECEIVER将由SENDER与System.Diagnostics.Process对象一起启动

RECEIVER将以隐藏模式启动,因此它没有MainWindowHandle

然后我们无法使用Win32.WM_COPYDATA向RECEIVER发送消息,因为它需要MainWindowHandle

我需要的是能够通过任何方法定期发送和接收消息。

我检查了以下链接的手册MainWindowHandle但它没有帮助:

将消息发送到Windows进程(而不是其主窗口)

一个解决方案可能是System.Diagnostics.Process的有用对象,它可以帮助我们将消息发送到进程。

有两种方法可以在两个进程之间共享信息。

首先,你必须考虑当你的应用程序扩展时,两个进程是否总是在同一台机器上。

不同的机器

  • 使用TCP / UDP套接字连接(可以是最快的解决方案)
  • 使用MSMQ
  • 使用WebServices,WCF或Restful Web Service。
  • 从数据库中的公共条目读取。 (不建议)
  • 命名管道(检查此项 )(命名管道可以在同一台机器上或通过网络飞行)

永远在同一台机器上。

  • 共享内存(可以使用内存映射文件 )
  • 从公共文件中读取(可以使用FileWatcher )

首选:MSMQ

如果我是你,我会保留在不同机器中使用进程的能力,因此我会像Maarten建议的那样使用两个使用MSMQ进行通信的Windows服务。 为什么?

  1. MSMQ允许您不丢失消息(如果RECEIVER已关闭)
  2. MSMQ允许您在同一台机器或不同机器中进行处理
  3. Windows服务使您能够轻松启动/停止进程
  4. Windows服务可以监控我的SNMP,通常它们可以轻松地与Windows管理工具集成。

第二选择:Restful Web Service

如果您不想使用MSMQ,我将使用IIS中托管的两个Restful Web Service来传达这两个进程。 如果你有一个场景,如果他们迟到,RECEIVER对来自SENDER的消息不感兴趣,那么它会非常有用。

老问题,我知道。
偶然发现它,因为我有一个类似的任务。
一个应用程序从另一个应用程序开始 – 它将再次结束,但没有人知道何时。
1.应用程序可以再次启动2.但必须等到2.之前的实例已经退出。
始终在同一台PC(和Windows)上。

当程序正在运行时,使用注册表来设置值,并且当它退出时再次删除/重置它是一件简单的事情。
1.应用程序可以检查注册表,看看是否可以启动2. app的另一个实例。

您还可以使用注册表在应用程序之间传递值。 缺点是,应用程序必须轮询注册表,而不是发送消息。 更简单但效果更差。

所以可能取决于它需要什么。

我认为MSMQ是一个不错的选择。