Pergunta

Nunca tive de fazer IPC no Windows antes.Atualmente estou desenvolvendo um par de programas, um padrão GUI/CLI app e de um serviço do windows.O app tem para dizer o que fazer.Assim, supondo que a comunicação é apenas local, o que seria o melhor método de comunicação para estes dois processos?

Onde o melhor é definida como mais robusto e menos propenso a erros, não mais a performance nem o mais fácil de código.

Exemplos de código serão muito bem-vindos, mas não são necessários :-)

Nota que eu estou perguntando sobre o que usar, um padrão de soquete TCP, pipes nomeados, ou alguns outros meios de comunicação.

Obrigado!

Foi útil?

Solução

DAC .Líquido pode ser alcançado através de:

WCF

usando pipes nomeados requer .Net 3.0 e acima.

Exemplo de código


Sistema de interacção remota

O original IPC framework lançado com .Net 1.0.Eu acredito sistema de interacção remota não está mais sendo desenvolvido ativamente, e você é encorajado a usar o WCF em vez

Exemplo de código

Comunicação entre processos através de sistema de interacção remota - usa um canal tcp

Recursos


Win32 RPC usando csharptest-net RpcLibrary

Eu vim através de um projeto recentemente que tem moldado o Win32 biblioteca RPC e criado um .net biblioteca de classes que pode ser usado para o local e remoto RPC

Página inicial do projeto: http://csharptest.net/projects/rpclibrary/

MSDN referências:

Também tem um google protocol buffers para cliente rpc que é executado no topo da biblioteca: https://code.google.com/p/protobuf-csharp-rpc/


WM_COPYDATA

Para a completude também é possível utilizar o método com o WIN32 WM_COPYDATA mensagem.Eu usei este método de antes .Net 1.1 para criar uma única instância da aplicação abrir vários ficheiros a partir do windows explorer.

Recursos

Sockets

Usando um protocolo personalizado (mais difícil)

Outras dicas

Para só local, tivemos sucesso usando Pipes Nomeados.Evita a sobrecarga do TCP, e é muito bonito (pelo menos para .NET) tão eficiente como você pode começar tendo também uma API decente para trabalhar.

Desde que você está limitado .Net 2.0 WCF é, talvez, não uma opção.Você pode usar .Net remoting com memória compartilhada como subjacente mecanismo de comunicação entre domínios de aplicação na mesma máquina.Usando essa abordagem, você pode colocar facilmente os seus processos em máquinas diferentes e substituir o protocolo de memória partilhada com um protocolo de rede.

O método padrão de comunicação com um serviço do windows é usar o serviço de controle de códigos.Windows services pode receber códigos de 0 a 255.De 0 a 127 é reservado para o sistema.128 a 255 pode ser utilizado para comandos personalizados.

Se você precisar enviar um complexo de objetos para o uso de serviços de banco de dados, xml, arquivo, tcp, http, etc.Outros, que para o envio de comandos de controle como recarregar a configuração, processo de itens etc códigos de controle deve ser usado.

Existem funcionalidades adicionais disponíveis, tais como a consultar o serviço.Consulte o Windows documentação do serviço e do api.

http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/

Sua melhor aposta é usar o WCF.Você será capaz de criar um serviço de acolhimento no serviço do windows e expor uma interface bem definida que a GUI do aplicativo pode consumir.O WCF permite comunicar através de pipes nomeados, se você escolher ou você pode escolher qualquer outro meio de comunicação protocal como o TCP, HTTP, etc.O uso do WCF que você obter excelente ferramenta de apoio e de muita informação disponível.

Eu gostaria de acrescentar a esta discussão.Por favor, me repreendas se este é o caminho para sair de lá, mas não conseguia um semáforo (ou vários semáforos) ser usado para comunicação rudimentar?

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