Méthode .NET correcte pour implémenter une application à instance unique

J’ai vu au moins trois méthodes distinctes sur StackOverflow pour y parvenir.

  1. Utiliser un MUTEX: réponse acceptée à cette question SO

  2. Utilisation de WindowsFormsApplicationBase de la bibliothèque Microsoft.VisualBasic: Deuxième réponse la plus votée à cette question SO

  3. Utilisation de Process.GetProcessNames pour vérifier si votre application est en cours d’exécution: Méthode ici a été publiée en tant que réponse à cette question SO

Je suis sûr qu’il y a plus de façons de faire cela aussi.

Je me demande simplement si l’une de ces solutions est préférée et quelles pourraient en être les conséquences si je choisissais la “mauvaise”.

En cas de doute, préférez toujours une implémentation incluse dans le framework .NET. Vous pouvez avoir de grandes attentes qu’une telle implémentation soit testée par des centaines de milliers de programmeurs, qu’elle ait été soigneusement examinée du sharepoint vue de la sécurité et de la convivialité, et qu’elle sera maintenue pendant des années.

L’approche mutex est facile à mettre en œuvre. Il souffre cependant d’un problème de sécurité assez grave. Une attaque par déni de service est très simple, vous ne pouvez pas garder le nom de votre mutex secret et tout le monde peut créer sortingvialement un mutex du même nom et empêcher votre programme de démarrer.

L’approche du nom du processus est profondément imparfaite pour la même raison. Il n’y a aucune garantie qu’un nom de processus est unique. Pas simplement facile à exploiter mais facilement déclenchée par accident.

WindowsFormsApplicationBase a un problème d’image aux yeux des programmeurs C #. Ils étouffent le nom de l’espace de noms et supposent que leur programme sera infecté par vb-isms. C’est absurde, c’est juste une classe .NET simple, utilisable dans toutes les langues.

Pourquoi personne n’a mentionné cocher cette case ?

entrez la description de l'image ici

C’est vraiment une question de goût, mais je Mutex approche Mutex , simplement parce qu’elle ne nécessite pas de dépendance vis-à-vis des bibliothèques VisualBasic, et que l’utilisation de Process.GetProcessNames est une solution non idéale carte à ce que vous pensez qu’ils pourraient)