Pergunta

Suponha que eu tenha dois aplicativos escritos em C#.O primeiro é um aplicativo de terceiros que gera um evento chamado “OnEmailSent”.

O segundo é um aplicativo personalizado que escrevi e que gostaria de assinar de alguma forma no "OnEmailSent" até mesmo do primeiro aplicativo.

Existe alguma maneira de anexar o segundo aplicativo a uma instância do primeiro aplicativo para escutar o evento "OnEmailSent"?


Portanto, para maiores esclarecimentos, meu cenário específico é que temos um aplicativo personalizado de terceiros escrito em c# que gera um evento "OnEmailSent".Podemos ver que o evento existe usando o refletor.

O que queremos fazer é que algumas outras ações ocorram quando este componente enviar um email.

A maneira mais eficiente que podemos imaginar seria usar alguma forma de IPC, como sugerido por Anders, e ouvir o evento OnEmailSent gerado pelo componente de terceiros.

Como o componente é escrito em C#, estamos brincando com a ideia de escrever outro aplicativo C# que possa se anexar ao processo em execução e quando detectar que o evento OnEmailSent foi gerado, ele executará seu próprio código de manipulação de eventos.


Posso estar faltando alguma coisa, mas pelo que entendi sobre como funciona a comunicação remota, seria necessário que houvesse um servidor definindo algum tipo de contrato que o cliente pudesse assinar.

Eu estava pensando mais em um cenário em que alguém escreveu um aplicativo independente como o Outlook, por exemplo, que expõe eventos que eu gostaria de assinar em outro aplicativo.

Acho que o cenário em que estou pensando é o depurador .net e como ele pode ser anexado à execução de assemblies para inspecionar o código enquanto ele está em execução.

Foi útil?

Solução

Para que duas aplicações (processos separados) troquem eventos, elas devem concordar sobre como esses eventos são comunicados.Existem muitas maneiras diferentes de fazer isso, e exatamente qual método usar pode depender da arquitetura e do contexto.O termo geral para este tipo de troca de informações entre processos é Comunicação entre processos (IPC).Existem muitas maneiras padrão de fazer IPC, sendo as mais comuns arquivos, pipes, soquetes (de rede), chamadas de procedimento remoto (RPC) e memória compartilhada.No Windows também é comum usar mensagens de janela.

Não tenho certeza de como isso funciona para aplicativos .NET/C# no Windows, mas em aplicativos Win32 nativos você pode conecte-se ao loop de mensagens de processos externos e "espione" as mensagens que eles estão enviando.Se o seu programa gerar um evento de mensagem quando a função desejada for chamada, esta pode ser uma forma de detectá-la.

Se você estiver implementando ambos os aplicativos, poderá optar por usar qualquer método IPC de sua preferência.Soquetes de rede e protocolos baseados em soquetes de nível superior, como HTTP, XML-RPC e SOAP, são muito populares atualmente, pois permitem executar aplicativos também em diferentes máquinas físicas (desde que estejam conectados por meio de uma rede).

Outras dicas

Podes tentar Espião Gerenciado e para acesso programático ManagedSpyLib

O ManagedSpylib apresenta uma classe chamada ControlProxy.Um ControlProxy é uma representação de um sistema.windows.forms.Control em outro processo.O ControlProxy permite obter ou definir propriedades e assinar eventos como se estivesse executando dentro do processo de destino.Use ManagedSpylib para testes de automação, registro de eventos para compatibilidade, comunicação cruzada de processo ou teste de caixa branca.

Mas isso pode não funcionar para você, depende se o ControlProxy pode de alguma forma acessar o evento que você procura em seu aplicativo de terceiros.

Você também pode usar Reflexil

O reflexo permite modificações de IL usando a poderosa biblioteca mono.Cecil escrita por JB Evain.O reflexo é executado como plug-in refletor e é direcionado especialmente para o manuseio do código IL.Ele faz isso propondo um editor de instruções completo e permitindo a injeção de código C#/vb.net.

Qual é a natureza desse evento OnEmailSent desse aplicativo de terceiros?Quero dizer, como você sabe que o aplicativo está acionando tal evento?

Se você está planejando fazer comunicação entre processos, a primeira pergunta que você deve se fazer é:É realmente necessário?

Sem questionar seus motivos, se você realmente precisa fazer comunicação entre processos, precisará de algum tipo de mecanismo.A lista é longa, muito longa.Desde simples mensagens WM_DATA até protocolos TCP personalizados e serviços Web muito complexos que exigem infraestruturas adicionais.

Isso traz a questão: o que você está tentando fazer exatamente?O que é esse aplicativo de terceiros sobre o qual você não tem controle?

Além disso, o depurador possui uma forma muito invasiva de depurar processos.Não espere que esse seja o mecanismo interprocesso padrão usado por todos os outros aplicativos.Na verdade, não é.

Você pode implementar um cenário semelhante com notificações de alteração de consulta do SQL Server 2005, mantendo um SqlConnection persistente com um aplicativo .NET que bloqueia até que os dados sejam alterados no banco de dados.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top