aplicativo de instância única com passagem de mensagens através da linha de cmd?
-
18-09-2019 - |
Pergunta
Eu tenho um aplicativo C # que é lançado via linha de comando. Normalmente dados é passar através da linha de comando como add (app -a string
). Gostaria apenas uma instância do aplicativo para ser aberto e se mais cordas são adicionados via linha de comando i gostaria que a única instância de saber sobre ele e se atualizar. I pode colocar os dados no banco de dados corretamente e msg a instância em execução ou msg e passar os dados para a instância em execução e deixá-lo colocá-lo no db e atualizar-se.
Como eu iria fazer isso em C # .NET? (3.5)
Solução
A primeira instância do aplicativo deve criar um pipe nomeado, as instâncias subsequentes do aplicativo não seria suficiente para criar o mesmo pipe nomeado e deverá vez tentar abrir o pipe nomeado para o uso. Uma vez aberta, a string (ou realmente quaisquer dados) pode ser transferido para a instância já em execução do aplicativo. O pipe nomeado pode então ser fechada e o aplicativo pode sair.
Como alternativa, você poderia usar .NET Remoting e registrar um tipo bem conhecido que outras instâncias do aplicativo poderia ativar, com comportamento semelhante ao que é descrito acima.
Em última análise, uma rápida pesquisa na "IPC" ou "Inter-Process Communication" pode abrir outras alternativas. Mas acredito que a abordagem pipe nomeado é o mais limpo e seria o mais fácil de implementar / estender.
Para "primeira execução" detecção você também pode criar um mutex nomeado, no caso de você optar por um mecanismo IPC que não apresentam uma condição de falha no múltiplo-runs (por exemplo, usando um banco de dados como um meio-homem para a parte de dados). Não há dois processado pode "criar" um mutex com o mesmo nome, esta é a mesma restrição como com Pipes nomeados, como esses nomes são geridas pelo Kernel (e, portanto, do processo de amplitude, de sessão, desktop e janelas estação limites.)