Слушайте события в другом приложении - PullRequest
17 голосов
/ 20 августа 2008

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

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

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


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

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

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

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


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

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

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

Ответы [ 5 ]

12 голосов
/ 20 августа 2008

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

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

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

2 голосов
/ 20 августа 2008

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

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

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

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

Рефлексил позволяет Модификации IL с использованием мощных Библиотека Mono.Cecil, написанная Jb Evain. Reflexil работает как плагин Reflector и особенно направлен на код IL обработки. Это достигается путем предлагая полную инструкцию редактор и позволяя C # / VB.NET код инъекции.

1 голос
/ 20 августа 2008

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

0 голосов
/ 20 августа 2008

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

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

0 голосов
/ 20 августа 2008

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...