在另一个应用程序中监听事件
假设我有两个用C#编写的应用程序。第一个是第三方应用程序,它引发一个称为" OnEmailSent"的事件。
第二个是我编写的自定义应用程序,我想以某种方式订阅第一个应用程序的" OnEmailSent"。
有什么办法可以将第二个应用程序添加到第一个应用程序的实例上,以侦听" OnEmailSent"事件?
因此,为进一步澄清,我的特定情况是我们有一个用c编写的自定义第三方应用程序,该应用程序引发了" OnEmailSent"事件。我们可以使用反射器查看事件的存在。
我们要做的是,当此组件发送电子邮件时,还要执行一些其他操作。
我们能想到的最有效的方法是能够使用安德斯(Anders)建议的某种形式的IPC,并侦听第三方组件引发的OnEmailSent事件。
因为该组件是用Cwe编写的,所以正在编写另一个可以将自身添加到执行过程的C应用程序,并且当它检测到OnEmailSent事件被引发时,它将执行自己的事件处理代码。
我可能会遗漏一些东西,但是据我所知,远程处理的工作原理是需要有一台服务器来定义客户端可以订阅的某种合同。
我更多地考虑的是有人编写了一个独立应用程序(例如Outlook)的情况,该应用程序公开了我想从另一个应用程序订阅的事件。
我猜想我想的场景是.net调试器,以及如何将其添加到正在执行的程序集上以在代码运行时对其进行检查。
解决方案
回答
我们可以使用远程处理或者WCF。请参阅http://msdn.microsoft.com/zh-cn/library/aa730857(VS.80).aspx#netremotewcf_topic7.
回答
我们可以尝试使用Managed Spy并以编程方式访问ManagedSpyLib
ManagedSpyLib introduces a class called ControlProxy. A ControlProxy is a representation of a System.Windows.Forms.Control in another process. ControlProxy allows you to get or set properties and subscribe to events as if you were running inside the destination process. Use ManagedSpyLib for automation testing, event logging for compatibility, cross process communication, or whitebox testing.
但这可能对我们不起作用,这取决于ControlProxy是否可以某种方式访问第三方应用程序中的事件。
我们也可以使用Reflexil
Reflexil allows IL modifications by using the powerful Mono.Cecil library written by Jb EVAIN. Reflexil runs as Reflector plug-in and is directed especially towards IL code handling. It accomplishes this by proposing a complete instruction editor and by allowing C#/VB.NET code injection.
回答
该第三方应用程序中的OnEmailSent事件的性质是什么?我的意思是,我们怎么知道应用程序正在触发这样的事件?
如果我们打算进行进程间通信,那么我们应该问自己的第一个问题是:真的有必要吗?
在不怀疑动机的情况下,如果我们确实需要进行进程间通信,则将需要某种机制。清单很长,很长。从简单的WM_DATA消息到自定义TCP协议,再到需要其他基础结构的非常复杂的Web服务。
这就带来了一个问题,我们到底想做什么?我们无法控制的第三方应用程序是什么?
而且,调试器具有一种非常侵入性的调试过程方式。不要期望这是所有其他应用程序使用的标准进程间机制。事实上,事实并非如此。
回答
我们可以通过使用.NET应用程序维护持久的SqlConnection来阻止SQL数据库中的数据更改,从而实现与SQL Server 2005查询更改通知类似的方案。
参见http://www.code-magazine.com/article.aspx?quickid=0605061.
回答
为了使两个应用程序(独立的进程)交换事件,它们必须就如何传递这些事件达成共识。有许多不同的方法可以执行此操作,确切地使用哪种方法可能取决于体系结构和上下文。进程之间的这种信息交换的总称是进程间通信(IPC)。存在许多执行IPC的标准方法,最常见的方法是文件,管道,(网络)套接字,远程过程调用(RPC)和共享内存。在Windows上,通常也使用窗口消息。
我不确定这对于Windows上的.NET / C应用程序如何工作,但是在本机Win32应用程序中,我们可以连接到外部进程的消息循环,并"监视"它们正在发送的消息。如果程序在调用所需函数时生成消息事件,则可能是检测它的一种方式。
如果我们自己实现两个应用程序,则可以选择使用我们喜欢的任何IPC方法。如今,网络套接字和基于高级套接字的协议(例如HTTP,XML-RPC和SOAP)非常流行,因为它们还允许我们在不同的物理计算机上运行应用程序(假设它们通过网络连接)。