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

Предположим, что у меня два приложения, написанные на С#. Первое является сторонним приложением, которое вызывает событие под названием "OnEmailSent".

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

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


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

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

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

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


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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Reflexil позволяет IL с использованием мощных Библиотека Mono.Cecil, написанная Jb Evain. Reflexil работает как плагин Reflector и направлена ​​прежде всего на IL-код обработки. Это достигается путем предложение полной инструкции редактор и разрешая код С#/VB.NET инъекции.

Ответ 4

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

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

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

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

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

Ответ 5

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

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