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

时间:2008-08-20 13:01:01

标签: c# events delegates

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

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

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


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

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

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

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


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

我更多地考虑有人编写了一个独立的应用程序,例如outlook,它暴露了我想从其他应用程序订阅的事件。

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

5 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:2)

您可以尝试Managed Spy并进行程序化访问 ManagedSpyLib

  

ManagedSpyLib引入了一个类   叫ControlProxy。 ControlProxy是   代表一个   System.Windows.Forms.Control in   另一个过程。 ControlProxy允许   你获得或设置属性和   像你一样订阅活动   在目的地内跑步   处理。使用ManagedSpyLib   自动化测试,事件记录   兼容性,交叉过程   沟通或白盒测试。

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

您也可以使用Reflexil

  

Reflexil允许   通过使用强大的IL修改   由Jb编写的Mono.Cecil库   EVAIN。 Reflexil作为Reflector插件运行   特别针对IL代码   处理。它完成了这一点   提出完整的指示   编辑器和允许C#/ VB.NET代码   注射。

答案 2 :(得分:1)

答案 3 :(得分:0)

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

如果正在计划进行进程间通信,那么你应该问自己的第一个问题是:它真的有必要吗?

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

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

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

答案 4 :(得分:0)

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

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