Слушайте события в другом приложении

Предположим, у меня есть два приложения, написанные на C#. Первое - это стороннее приложение, которое вызывает событие под названием «OnEmailSent».

Второе - это написанное мной пользовательское приложение, которое я хотел бы каким-то образом подписаться на «OnEmailSent» даже для первого приложения.

Есть ли способ каким-либо образом прикрепить второе приложение к экземпляру первого приложения для прослушивания события «OnEmailSent»?


Итак, для дальнейшего пояснения, мой конкретный сценарий заключается в том, что у нас есть настраиваемое стороннее приложение, написанное на C#, которое вызывает событие «OnEmailSent». Мы можем видеть, что событие существует, используя отражатель.

Мы хотим, чтобы при отправке электронного письма этим компонентом выполнялись некоторые другие действия.

Самый эффективный способ, который мы можем придумать, - это иметь возможность использовать какую-либо форму IPC, как предлагал Андерс, и прослушивать событие OnEmailSent, вызываемое сторонним компонентом.

Поскольку компонент написан на C#, мы пытаемся создать еще одно приложение C#, которое может подключаться к выполняющемуся процессу, и когда оно обнаружит, что событие OnEmailSent было вызвано, оно выполнит свой собственный код обработки событий.


Возможно, мне что-то не хватает, но насколько я понимаю, как работает удаленное взаимодействие, так это то, что должен быть сервер, определяющий какой-то контракт, на который клиент может подписаться.

Я больше думал о сценарии, когда кто-то написал отдельное приложение, такое как, например, Outlook, которое предоставляет события, на которые я хотел бы подписаться из другого приложения.

Я думаю, что сценарий, о котором я думаю, - это отладчик .net и то, как он может подключаться к выполняющимся сборкам для проверки кода во время его работы.

Ответов (5)

Решение

Чтобы два приложения (отдельные процессы) обменивались событиями, они должны согласовать способ передачи этих событий. Есть много разных способов сделать это, и какой именно метод использовать, может зависеть от архитектуры и контекста. Общий термин для такого обмена информацией между процессами - межпроцессное взаимодействие (IPC) . Существует множество стандартных способов выполнения IPC, наиболее распространенными из которых являются файлы, каналы, (сетевые) сокеты, удаленные вызовы процедур (RPC) и разделяемая память. В Windows также часто используются оконные сообщения .

Я не уверен, как это работает для приложений .NET / C# в Windows, но в собственных приложениях Win32 вы можете подключиться к циклу сообщений внешних процессов и «шпионить» за сообщениями, которые они отправляют . Если ваша программа генерирует событие сообщения при вызове нужной функции, это может быть способом ее обнаружения.

Если вы сами реализуете оба приложения, вы можете использовать любой предпочитаемый вами метод IPC. Сетевые сокеты и протоколы на основе сокетов более высокого уровня, такие как HTTP, XML-RPC и SOAP, очень популярны в наши дни, поскольку они позволяют запускать приложения также на разных физических машинах (при условии, что они подключены через сеть).

Вы можете использовать удаленное взаимодействие или WCF. См. http://msdn.microsoft.com/en-us/library/aa730857(VS.80).aspx#netremotewcf_topic7 .

Вы можете попробовать Managed Spy и для программного доступа ManagedSpyLib

ManagedSpyLib представляет класс ControlProxy. ControlProxy - это представление System.Windows.Forms.Control в другом процессе. ControlProxy позволяет вам получать или устанавливать свойства и подписываться на события, как если бы вы работали внутри целевого процесса. Используйте ManagedSpyLib для автоматизации тестирования, ведения журнала событий для совместимости, межпроцессного взаимодействия или тестирования белого ящика.

Но это может не сработать для вас, зависит от того, может ли ControlProxy каким-либо образом получить доступ к событию, которое вы ищете, в стороннем приложении.

Вы также можете использовать Reflexil

Reflexil позволяет модифицировать IL с помощью мощной библиотеки Mono.Cecil, написанной Jb EVAIN. Reflexil работает как подключаемый модуль Reflector и ориентирован в первую очередь на обработку кода IL. Для этого предлагается полный редактор инструкций и возможность внедрения кода C# / VB.NET.

Вы можете реализовать аналогичный сценарий с уведомлениями об изменении запроса SQL Server 2005, поддерживая постоянное соединение SqlConnection с приложением .NET, которое блокируется до тех пор, пока данные в базе данных не изменятся.

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

Какова природа этого события OnEmailSent из этого стороннего приложения? Я имею в виду, откуда вы знаете, что приложение запускает такое событие?

Если вы планируете осуществлять межпроцессное взаимодействие, первый вопрос, который вы должны задать себе: действительно ли это необходимо?

Не подвергая сомнению свои мотивы, если вам действительно нужно осуществлять межпроцессное взаимодействие, вам понадобится какой-то механизм. Список длинный, очень длинный. От простых сообщений WM_DATA до настраиваемых протоколов TCP и очень сложных веб-служб, требующих дополнительных инфраструктур.

Возникает вопрос: что именно вы пытаетесь сделать? Что это за стороннее приложение, над которым вы не можете повлиять?

Кроме того, отладчик имеет очень агрессивный способ отладки процессов. Не ожидайте, что это будет стандартный механизм межпроцессного взаимодействия, используемый всеми другими приложениями. На самом деле это не так.