Correggere il modo .NET per implementare un’applicazione a istanza singola

Ho visto almeno tre metodi distinti su StackOverflow per raggiungere questo objective.

  1. Utilizzo di MUTEX: risposta accettata a questa domanda SO

  2. Utilizzo della libreria WindowsFormsApplicationBase di Microsoft.VisualBasic: seconda risposta più votata a questa domanda SO

  3. Utilizzo di Process.GetProcessNames per verificare se l’applicazione è in esecuzione: il metodo qui è stato pubblicato come risposta a questa domanda SO

Sono sicuro che ci sono anche altri modi per farlo.

Mi chiedo semplicemente se uno di questi è preferito e quali potrebbero essere le conseguenze se scelgo quello “sbagliato”.

    In caso di dubbio, preferisci sempre un’implementazione inclusa nel framework .NET. È ansible avere grandi aspettative che tale implementazione venga testata da centinaia di migliaia di programmatori, sia stata attentamente esaminata per garantire sicurezza e usabilità e verrà mantenuta per gli anni a venire.

    L’approccio mutex è facile da usare. Tuttavia soffre di un serio problema di sicurezza. Un attacco denial of service è molto semplice per iniziare, non è ansible mantenere segreto il nome del mutex e chiunque può creare banalmente un mutex con lo stesso nome e impedire che il programma si avvii.

    L’approccio al nome del processo è profondamente imperfetto per lo stesso motivo. Non vi è alcuna garanzia che il nome di un processo sia unico. Non solo facile da sfruttare, ma facilmente innescato per caso.

    WindowsFormsApplicationBase ha un problema di immagine agli occhi dei programmatori C #. Soffocano nel nome dello spazio dei nomi e presumono che il loro programma sarà in qualche modo infetto da vb-isms. È una sciocchezza, è solo una semplice class .NET che è utilizzabile in qualsiasi lingua.

    Perché nessuno ha menzionato questa casella di spunta ?

    inserisci la descrizione dell'immagine qui

    È davvero una questione di gusti, ma io preferisco l’approccio di Mutex , semplicemente perché non richiede una dipendenza dalle librerie di VisualBasic, e l’utilizzo di Process.GetProcessNames è una soluzione non ideale (come accennato, i nomi dei processi non vanno sempre a mappare a ciò che pensi potrebbero essere)