如何使进程在c#/ .net中的另一个进程中触发事件?

时间:2013-03-16 17:33:22

标签: c# .net vb.net interprocess

如何使进程1能够在进程-2中触发事件,并发送少量参数,以通知第二进程执行特定操作,并可选择接收回复?

可以使用文件系统执行此操作,可能有一个文件,其中process-1转储一些命令/查询,而process-2将不断从该文件读取,但是,这个解决方案并不好。 / p>

还有其他办法吗?

(我知道只要在项目属性中启用“单个实例”,VB.net就可以在启动新进程时在正在运行的进程中触发事件)

3 个答案:

答案 0 :(得分:2)

您可以使用命名EventWaitHandle来实现跨进程同步。

答案 1 :(得分:1)

This article似乎与vb.net single instance完全相同(而且它似乎仍然是一个可行的选择)。

简而言之,似乎有三种方法可以实现像解决方案这样的单一实例:

  • 使用Mutex
  • 在流程列表中循环以查看具有相同名称的流程是否已在运行
  • 将Visual Basic系统用于单实例应用程序(可以从C#访问)

答案 2 :(得分:1)

如果“进程”是指“app-domain”,那么在两者之间设置事件相当容易。事实上,如果你在两个独立的应用程序域中有两个类(其中每个类都有MarshalByRefObject作为基类),那么.net将自动设置一个远程结构,使事件看起来像在单个应用程序中一样 - 域。 (例如:http://msdn.microsoft.com/en-us/library/system.marshalbyrefobject.aspx

这里的关键是'出现'。 “应用程序域”和“进程”分离旨在保持资源的有效隔离。要访问进程外的任何内容,您真的需要来自操作系统的帮助,例如共享文件或Internet连接或命名管道 - 这样做会有所帮助。但是.net等概念在运行时空间之外不存在。

换句话说,如果两个进程在同一台机器上,如果在多个系统之间进行通信,则必须使用命名管道(http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream.aspx),TCPClient / TCPListener(http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx),或WCF,如果你需要更重的东西。

如果你想在实践中看到其中一种技术的具体例子,我可以为你写一个,顺便说一句。