Как предотвратить повторный запуск приложения | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Программист 1С Реверс-инжиниринг. Продвинутый курс
-16%
Java Developer. Professional
-17%
JavaScript Developer. Professional
-18%
Flutter Mobile Developer
-15%
JavaScript Developer. Basic
-16%
Highload Architect
-10%
Нереляционные базы данных
-17%
Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Архитектура и шаблоны проектирования
-14%
Framework Laravel
-13%
IoT-разработчик
-12%
Team Lead
-15%
VOIP инженер Разработчик C# Разработчик на Spring Framework AWS для разработчиков Cloud Solution Architecture CI/CD Vue.js разработчик Разработчик Node.js Scala-разработчик Супер - интенсив по Kubernetes Symfony Framework Advanced Fullstack JavaScript developer
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

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

l5zR6K7zKzQ-5020-dd8ed2.jpg

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

В 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 существует отдельный способ запуска ровно одной копии приложения, но он выходит за рамки данной заметки.

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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться