Как предотвратить повторный запуск приложения

Бывают ситуации, когда должна выполняться строго одна копия приложения. Например, это связано с авторизацией на некотором сервисе или работой с внешними устройствами.

В WinAPI данная проблема решалась просто: WinMain получал указатель на прошлый экземпляр запущенной программы. В C# мне о такой возможности не известно. Существует по крайней мере два способа решения задачи: поиск процессов идентичных себе и установка Mutex.

Оба способа имеют как преимущества, так и недостатки

В первом случае поиск осуществляется по имени процесса, но всегда можно переименовать программу перед повторным запуском. Во втором случае возможна атака за счёт генерации такого же Mutex злоумышленником.

Рассмотрим оба способа

Вариант с Mutex:

static bool IsSingleInstance()
{
   bool flag;
    Mutex mutex = new Mutex(true, "MY_UNIQUE_MUTEX_NAME", out flag);
    return flag;
}

Вариант с процессом:

if (Process.GetProcesses().Count(x=>x.ProcessName=="MyProcessName")>1)
    Process.GetCurrentProcess.Kill();

Имя процесса можно узнать с помощью Process.GetCurrentProcess().ProcessName. Кроме того, для WindowsForms существует отдельный способ запуска ровно одной копии приложения, но он выходит за рамки данной заметки.

Есть вопрос? Напишите в комментариях!