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

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

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

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


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

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

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

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


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

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

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

20.08.2008 13:01:01
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

14
20.08.2008 13:44:10

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

1
20.08.2008 13:07:15

Вы можете попробовать 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.

3
21.08.2008 01:11:41

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

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

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

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

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

0
20.08.2008 13:26:42

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

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

0
20.08.2008 13:30:23