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

Posted

技术标签:

【中文标题】如何在 c#/.net 中让一个进程在另一个进程中触发一个事件?【英文标题】:How to make a process fire an event in another process in c#/.net? 【发布时间】:2013-03-16 17:33:22 【问题描述】:

如何使 process-1 能够在 process-2 中触发事件,并发送一些参数,以指示第二个进程执行特定操作,并可选择接收回复?

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

还有其他方法吗?

(我知道在 VB.net 中很容易在启动新进程时触发正在运行的进程中的事件,如果在项目属性中启用了“单个实例”)

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

This article 似乎可以满足您对vb.net single instance 的习惯(而且它似乎仍然是一个可行的选择)。

简而言之,似乎有三种方法可以完成类似单实例的解决方案:

使用Mutex 循环浏览进程列表,查看是否有同名进程正在运行 将 Visual Basic 系统用于单实例应用程序(可以从 C# 访问)

【讨论】:

【参考方案3】:

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

这里的关键是“出现”。 “应用程序域”和“进程”分离旨在有意保持资源隔离。要访问您的进程之外的任何内容,您确实需要操作系统的帮助,例如共享文件或 Internet 连接或命名管道 - 类似的东西。但是像事件这样的 .net 概念在运行时中不存在于您的空间之外。

换句话说,如果两个进程都在同一台机器上,则必须使用诸如 Named-Pipes (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需要更重的东西。

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

【讨论】:

以上是关于如何在 c#/.net 中让一个进程在另一个进程中触发一个事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在漫长的过程中让 JScrollPane 更新

如何从另一个 .NET 进程获取对象的句柄?

如何在 C#/.Net 中模拟结束进程树

c_cpp 管道示例:从进程中读取字符并在另一个进程中以大写形式显示

如何检测在另一个进程中弹出的消息框?

在另一个进程中访问共享内存缓冲区