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

StackOverflow https://stackoverflow.com/questions/17878

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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


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

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

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

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


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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Вы также могли бы использовать Рефлексил

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

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

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

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

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

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

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

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

Видишь http://www.code-magazine.com/article.aspx?quickid=0605061.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top