.Net / Mono Singleton (Serviço / Servidor?) Em C # - detectar se meu aplicativo .net já está em execução e passar args de linha de comando a ele

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu gostaria de criar um aplicativo simples Singleton linha de comando (um serviço?) Em C # que quando foi executado, ele verificado para ver se ele já estava correndo, e se assim for, ele passou os argumentos de linha de comando para o já em execução instância e fechado em si. Agora, na instância já em execução que receberia os argumentos de linha de comando através de um evento como "delegar vazio Command (string [] args);" ou algo assim, para que eu possa gerenciar de linha de comando através de uma aplicação através de eventos.

Por exemplo, no photoshop, quando você abre uma imagem pela primeira vez, ele carrega uma nova photoshop exemplo, mas quando você abrir uma segunda imagem, ele verifica para ver se uma instância de photoshop já está em execução, e se é , ele passa a imagem para a instância já carregado de photoshop para que ele possa evitar a carga em tempo caro de photoshop tudo de novo ...

Ou no navegador da web, você pode configurá-lo por isso, se você abrir um novo arquivo .html, ele abre-se em uma nova aba, e não uma nova janela instância.

ou muitos editores de texto têm configurações para permitir que apenas uma instância do editor de texto aberto e quando um novo arquivo é aberto, ele é carregado em uma nova aba, e não uma nova janela ...

muitos jogadores de música como o Winamp fazer isso também ...

Eu estou indo para, eventualmente, ser essa configuração como um serviço, por isso deve ser constantemente a ouvir para argumentos de linha de comando mais tarde, mas por agora é principalmente para que eu possa gerenciar a abertura de arquivos de um tipo específico juntos em um aplicação Singleton, ou têm outras aplicações passar argumentos de linha de comando de arquivos que eles querem ser aberto ...

Além disso, se você sabe uma maneira melhor ou um api em .Net para re-rout todos de linha de comando args passado, para um evento de um serviço que está sempre correndo, eu posso trabalhar com isso ... mas eu' d também gostaria de manter esta plataforma cruzada para que ele possa ser executado em Linux / Mac em Mono se isso é possível, sem ter que gerenciar duas ou mais código-bases ...

Foi útil?

Solução

Este é o artigo i usado para implementar a funcionalidade exata que você está procurando, que permite a transferência de argumentos de linha de comando também.

Single Instance-C # Aplicação - para .NET 2.0

Outras dicas

Fizemos algo simillar usando embora para um propósito muito diferente usando .net remoting em 1.0 / 1.1 quadro. Basicamente, nós usaria um semáforo para garantir que foram a instância única execução. Você vai querer direcionar o namespace global, se você quiser ter apenas uma instância por máquina ou o local se você quer um por sessão de usuário (Em serviço de terminal e cenários de troca rápida de usuário).

Se você pode bloquear o semphore, você irá configurar comunicação remota e começar a ouvir para eventos, e depois continuar com o seu código.

Se você não pode bloquear, em seguida, você pode asssume você tem uma outra instância em execução, caso em que você vai abrir um canal de comunicação remota para a outra instância passar os argumentos e desligamento.

Você pode tentar usar um mutex nomeado (nomeá-lo vai tornar todo o sistema, e facilmente identificável). Com a exclusão mútua, você pode executar a instância (se nenhum mutex existe com o nome), ou você pode abrir a instância existente e passar em seus parâmetros. Desculpas para qualquer amostra de código, escrevendo isso do meu telefone.

Edit: nvrmnd. Apenas reler o post, e eu não acho que isso vai funcionar para você ir de plataforma cruzada.

Visual Basic tem esta embutido. Dê uma olhada em:

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase - StartupNextInstance Evento Público

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