.Net / Mono Singleton (Service / Server?) In C # - rileva se la mia app .net è già in esecuzione e passa gli argomenti della riga di comando ad essa

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

  •  03-07-2019
  •  | 
  •  

Domanda

Vorrei creare una semplice applicazione a riga di comando singleton (un servizio?) in C # che quando è stata eseguita, ha verificato per vedere se era già in esecuzione e, in tal caso, ha passato gli argomenti della riga di comando al istanza già in esecuzione e chiusa da sola. Ora, nell'istanza già in esecuzione, riceverebbe gli arg della riga di comando attraverso un evento come " delegate void Command (string [] args); " o qualcosa del genere, così posso gestire la riga di comando attraverso un'applicazione tramite eventi.

Ad esempio in Photoshop, quando apri un'immagine per la prima volta, carica un nuovo Photoshop Photoshop, ma quando apri una seconda immagine, controlla se un'istanza di Photoshop è già in esecuzione e se lo è , passa l'immagine all'istanza già caricata di Photoshop così da evitare di nuovo il costoso tempo di caricamento di Photoshop ...

O nel browser web, puoi impostarlo in modo che se apri un nuovo file .html, lo apra in una nuova scheda, non in una nuova istanza di finestra.

o molti editor di testo hanno impostazioni che consentono di aprire solo un'istanza dell'editor di testo e quando viene aperto un nuovo file, questo viene caricato in una nuova scheda, non in una nuova finestra ...

anche molti lettori musicali come Winamp lo fanno ...

Alla fine lo configurerò come un servizio, quindi dovrei ascoltare costantemente gli argomenti della riga di comando in un secondo momento, ma per ora è principalmente così che posso gestire l'apertura di file di un tipo specifico insieme in uno applicazione singleton o altre applicazioni passano gli argomenti della riga di comando dei file che vogliono essere aperti ...

Inoltre, se conosci un modo migliore o un'API in .Net per reindirizzare tutti gli argomenti della riga di comando passati, a un evento di un servizio sempre in esecuzione, posso lavorare con quello ... ma io ' Mi piacerebbe anche mantenere questo multipiattaforma in modo che possa funzionare su Linux / Mac su Mono, se possibile, senza dover gestire due o più basi di codice ...

È stato utile?

Soluzione

Questo è l'articolo che ho usato per implementare l'esatta funzionalità che stai cercando, ti consente di trasferire anche gli argomenti della riga di comando.

Applicazione C # a istanza singola - per .NET 2.0

Altri suggerimenti

Abbiamo fatto qualcosa di simile usando anche se per uno scopo molto diverso usando il telecomando .net sul framework 1.0 / 1.1. Fondamentalmente useremmo un semaforo per assicurarci di essere l'unica istanza in esecuzione. Ti consigliamo di scegliere come target lo spazio dei nomi globale, se vuoi avere solo un'istanza per macchina o il locale se ne desideri uno per sessione utente (In scenari di servizio terminal e cambio rapido utente).

Se riesci a bloccare semphore, imposterai il remoting e inizierai ad ascoltare gli eventi, quindi proseguirai con il tuo codice.

se non riesci a bloccare, puoi supporre di avere un'altra istanza in esecuzione, nel qual caso aprirai un canale remoto all'altra istanza passando args e shutdown.

Potresti provare a usare un mutex chiamato (nominarlo renderà il sistema ampio e facilmente identificabile). Con il mutex, è possibile eseguire l'istanza (se non esiste alcun mutex con il nome) oppure è possibile aprire l'istanza esistente e passare i parametri. Mi scuso per nessun esempio di codice, scrivendo questo dal mio telefono.

Modifica: nvrmnd. Rileggi il post e non credo che questo funzionerà per te che vai su più piattaforme.

Visual Basic ha questo built-in. Dai un'occhiata a:

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase - Avvio evento pubblico NextInstance

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top