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

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

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


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

我们想要做的是当该组件发送电子邮件时发生一些其他操作。

我们能想到的最有效的方法是能够使用某种形式的 IPC,如 anders 建议的那样,并侦听第三方组件引发的 OnEmailSent 事件。

由于该组件是用 C# 编写的,因此我们正在考虑编写另一个 C# 应用程序,该应用程序可以将自身附加到执行进程,并且当它检测到已引发 OnEmailSent 事件时,它将执行自己的事件处理代码。


我可能会遗漏一些东西,但根据我对远程处理工作原理的理解,需要有一个服务器来定义客户端可以订阅的某种合同。

我更多地考虑了这样一个场景:有人编写了一个独立的应用程序,例如 Outlook,它公开了我想从另一个应用程序订阅的事件。

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

有帮助吗?

解决方案

为了使两个应用程序(单独的进程)交换事件,它们必须就这些事件的通信方式达成一致。有许多不同的方法可以做到这一点,具体使用哪种方法可能取决于体系结构和上下文。进程间这种信息交换的总称是 进程间通信(IPC). 。存在许多执行 IPC 的标准方法,最常见的是文件、管道、(网络)套接字、 远程过程调用 (RPC) 和共享内存。在 Windows 上也很常见 窗口消息.

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

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

其他提示

你可以试试 托管间谍 以及用于编程访问 托管间谍库

ManagedSpylib引入了一个称为ControlProxy的类。ControlProxy是System.windows.forms.control在另一个过程中的表示。ControlProxy允许您获取或设置属性并订阅事件,就好像您在目标过程中运行一样。使用ManagedSpylib进行自动化测试,事件记录以兼容,交叉处理通信或白盒测试。

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

你也可以使用 反射

Reflexil允许使用JB Evain撰写的功能强大的单声道库来修改IL。Reflexil作为反射器插件运行,特别针对IL代码处理。它通过提出完整的说明编辑器并允许C#/vb.net代码注入来实现这一目标。

该第三方应用程序的 OnEmailSent 事件的性质是什么?我的意思是,您如何知道应用程序正在触发此类事件?

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

不怀疑你的动机,如果你真的需要进行进程间通信,你将需要某种机制。名单很长,很长。从简单的 WM_DATA 消息到自定义 TCP 协议,再到需要额外基础设施的非常复杂的 Web 服务。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top