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

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

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

因此,为进一步说明,我的特定情况是我们有一个用C#编写的自定义第三方应用程序,该应用程序引发了“OnEmailSent”事件。我们可以使用反射器查看事件的存在。

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

我们能想到的最有效的方法是能够使用安德斯(Anders)建议的某种形式的IPC,并侦听第三方组件引发的OnEmailSent事件。

因为该组件是用C#编写的,所以我们想编写另一个可以将其自身附加到执行过程的C#应用​​程序,并且当它检测到OnEmailSent事件被引发时,它将执行自己的事件处理代码。

我可能会遗漏一些东西,但是据我所知,远程处理的工作原理是需要有一台服务器来定义客户端可以订阅的某种契约(Contract)。

我更多地考虑的是某个人编写了一个独立应用程序(例如Outlook)的情况,该应用程序公开了我想从另一个应用程序订阅的事件。

我想我想到的场景是.net调试器,以及如何将其附加到正在执行的程序集上以在代码运行时对其进行检查。

最佳答案

为了使两个应用程序(独立的进程)交换事件,它们必须就如何传递这些事件达成共识。有许多不同的方法可以执行此操作,确切地使用哪种方法可能取决于体系结构和上下文。进程之间的这种信息交换的总称是Inter-process Communication (IPC)。存在许多执行IPC的标准方法,最常见的方法是文件,管道,(网络)套接字,remote procedure calls (RPC)和共享内存。在Windows上,通常使用window messages

我不确定Windows上的.NET/C#应用程序如何工作,但是在 native Win32应用程序中可以hook on to the message loop of external processes and "spy" on the messages they are sending。如果您的程序在调用所需函数时生成消息事件,则可能是检测它的一种方式。

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

10-08 11:38