如何在 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 中让一个进程在另一个进程中触发一个事件?的主要内容,如果未能解决你的问题,请参考以下文章