发送/接收消息到/从两个运行的应用程序
我有两个名为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服务。 为什么?
- MSMQ允许您不丢失消息(如果RECEIVER已关闭)
- MSMQ允许您在同一台机器或不同机器中进行处理
- Windows服务使您能够轻松启动/停止进程
- Windows服务可以监控我的SNMP,通常它们可以轻松地与Windows管理工具集成。
第二选择:Restful Web Service
如果您不想使用MSMQ,我将使用IIS中托管的两个Restful Web Service来传达这两个进程。 如果你有一个场景,如果他们迟到,RECEIVER对来自SENDER的消息不感兴趣,那么它会非常有用。
老问题,我知道。
偶然发现它,因为我有一个类似的任务。
一个应用程序从另一个应用程序开始 – 它将再次结束,但没有人知道何时。
1.应用程序可以再次启动2.但必须等到2.之前的实例已经退出。
始终在同一台PC(和Windows)上。
当程序正在运行时,使用注册表来设置值,并且当它退出时再次删除/重置它是一件简单的事情。
1.应用程序可以检查注册表,看看是否可以启动2. app的另一个实例。
您还可以使用注册表在应用程序之间传递值。 缺点是,应用程序必须轮询注册表,而不是发送消息。 更简单但效果更差。
所以可能取决于它需要什么。
我认为MSMQ是一个不错的选择。