在另一个应用程序中侦听事件

假设我有两个用C#编写的应用程序。 第一个是第三方应用程序,它引发一个名为“OnEmailSent”的事件。

第二个是我编写的自定义应用程序,我想以某种方式订阅“OnEmailSent”,即使是第一个应用程序。

有什么方法可以以某种方式将第二个应用程序附加到第一个应用程序的实例来侦听“OnEmailSent”事件?


因此,为了进一步说明,我的具体方案是我们有一个用c#编写的自定义第三方应用程序,它引发了一个“OnEmailSent”事件。 我们可以看到使用reflection器存在事件。

我们想要做的是在此组件发送电子邮件时进行一些其他操作。

我们能够想到的最有效的方法是能够使用某种forms的IPC作为anders建议并监听由第三方组件引发的OnEmailSent事件。

因为组件是用C#编写的,所以我们想要编写另一个可以将自己附加到执行进程的C#应用​​程序,当它检测到OnEmailSent事件已经被提升时,它将执行它自己的事件处理代码。


我可能会遗漏一些东西,但据我所知,远程处理的工作方式是需要一台服务器来定义客户可以订阅的某种合同。

我更考虑的是某人编写了一个独立的应用程序,例如outlook,它暴露了我想从另一个应用程序订阅的事件。

我想我正在考虑的场景是.net调试器以及它如何附加到执行程序集以在代码运行时检查代码。

为了使两个应用程序(单独的进程)交换事件,他们必须就如何传达这些事件达成一致。 有许多不同的方法可以做到这一点,确切地说使用哪种方法可能取决于架构和上下文。 进程之间这种信息交换的一般术语是进程间通信(IPC) 。 存在许多做IPC的标准方法,最常见的是文件,管道,(网络)套接字, 远程过程调用(RPC)和共享内存。 在Windows上,使用窗口消息也很常见。

我不确定这对于Windows上的.NET / C#应用程序是如何工作的,但在本机Win32应用程序中,您可以挂接到外部进程的消息循环,并对他们发送的消息进行“间谍” 。 如果程序在调用所需函数时生成消息事件,则可能是检测它的方法。

如果您自己实现这两个应用程序,则可以选择使用您喜欢的任何IPC方法。 如今,网络套接字和基于套接字的高级协议(如HTTP,XML-RPC和SOAP)非常流行,因为它们允许您在不同的物理机器上运行应用程序(假设它们通过网络连接)。

您可以尝试Managed Spy和编程访问ManagedSpyLib

ManagedSpyLib引入了一个名为ControlProxy的类。 ControlProxy是另一个进程中System.Windows.Forms.Control的表示forms。 ControlProxy允许您获取或设置属性并订阅事件,就像您在目标进程中运行一样。 使用ManagedSpyLib进行自动化测试,事件记录以实现兼容性,跨进程通信或白盒测试。

但这可能不适合您,取决于ControlProxy是否可以以某种方式访问​​您在第三方应用程序中的事件。

您也可以使用Reflexil

Reflexil通过使用Jb EVAIN编写的function强大的Mono.Cecil库来修改IL。 Reflexil作为Reflector插件运行,特别针对IL代码处理。 它通过提出一个完整的指令编辑器并允许C#/ VB.NET代码注入来实现这一点。

您可以使用远程处理或WCF。 请参阅http://msdn.microsoft.com/en-us/library/aa730857(VS.80).aspx#netremotewcf_topic7 。

来自该第三方应用程序的OnEmailSent事件的性质是什么? 我的意思是,你怎么知道应用程序触发了这样的事件?

如果打算进行进程间通信,那么您应该问自己的第一个问题是:它真的有必要吗?

在不质疑您的动机的情况下,如果您确实需要进行进程间通信,则需要某种机制。 清单很长很长。 从简单的WM_DATA消息到自定义TCP协议,再到需要额外基础架构的非常复杂的Web服务。

这带来了一个问题,你究竟要做的是什么? 您无法控制的第三方应用程序是什么?

此外,调试器具有非常侵入性的调试过程方式。 不要指望它是所有其他应用程序使用的标准进程间机制。 事实上,事实并非如此。

您可以通过使用.NET应用程序维护持久性SqlConnection来实现与SQL Server 2005查询更改通知类似的方案,该应用程序将阻塞直到数据库中的数据发生更改。

请参阅http://www.code-magazine.com/article.aspx?quickid=0605061 。