c# .net single-instance

c# - Manera correcta de.NET para implementar una aplicación de instancia única



single-instance (3)

He visto al menos tres métodos distintos en StackOverflow para lograr esto.

  1. Usando un MUTEX: respuesta aceptada a esta pregunta SO

  2. Usando WindowsFormsApplicationBase de la biblioteca Microsoft.VisualBasic: La segunda respuesta más votada a esta pregunta SO

  3. Uso de Process.GetProcessNames para verificar si su aplicación se está ejecutando: el método aquí se publicó como una respuesta a esta pregunta SO

Estoy seguro de que hay más formas de hacer esto también.

Simplemente me pregunto si se prefiere uno de estos y cuáles serían las consecuencias si elijo el "incorrecto".



En caso de duda, siempre prefiera una implementación que esté incluida en el marco .NET. Puede tener altas expectativas de que tal implementación sea probada por cientos de miles de programadores, que haya sido revisada cuidadosamente por su seguridad y facilidad de uso y se mantendrá durante los próximos años.

El enfoque mutex es fácil de seguir. Sin embargo, sufre de un problema de seguridad bastante grave. Un ataque de denegación de servicio es muy simple para comenzar, no puede mantener el nombre de su exclusión mutua en secreto y cualquiera puede crear de forma trivial una exclusión mutua con el mismo nombre y evitar que su programa se inicie.

El enfoque del nombre del proceso es profundamente defectuoso por la misma razón. No hay garantía de que un nombre de proceso sea único. No solo es fácil de explotar, sino que se activa fácilmente por accidente.

WindowsFormsApplicationBase tiene un problema de imagen a los ojos de los programadores de C #. Se atragantan con el nombre del espacio de nombres y asumen que su programa de alguna manera estará infectado con vb-isms. Eso es una tontería, es solo una clase simple de .NET que se puede usar en cualquier idioma.


Realmente es una cuestión de gusto, pero prefiero el enfoque Mutex , simplemente porque no requiere una dependencia de las bibliotecas de VisualBasic, y usar Process.GetProcessNames es una solución ideal (como se mencionó, los nombres de procesos no siempre van a mapa de lo que crees que podrían)