Сведения о вопросе

Oleksandr

00:57, 7th August, 2020

Теги

c#   events   delegates    

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

Просмотров: 361   Ответов: 5

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

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

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


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

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

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

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


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

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

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



  Сведения об ответе

dumai

14:08, 9th August, 2020

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

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

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


  Сведения об ответе

PAGE

21:39, 8th August, 2020

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

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

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

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

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


  Сведения об ответе

DAAA

13:47, 12th August, 2020

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


  Сведения об ответе

piter

08:24, 21st August, 2020

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

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

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

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

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


  Сведения об ответе

Chhiki

17:34, 28th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться