HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: mutex, c#, winapi, winmain, windowsforms, process.getcurrentprocess().processname</p>
1 <p>Теги: mutex, c#, winapi, winmain, windowsforms, process.getcurrentprocess().processname</p>
2 <p>Бывают ситуации, когда должна выполняться строго одна копия приложения. Например, это связано с авторизацией на некотором сервисе или работой с внешними устройствами.</p>
2 <p>Бывают ситуации, когда должна выполняться строго одна копия приложения. Например, это связано с авторизацией на некотором сервисе или работой с внешними устройствами.</p>
3 <p>В<strong>WinAPI</strong>данная проблема решалась просто:<strong>WinMain</strong>получал указатель на прошлый экземпляр запущенной программы. В C# мне о такой возможности не известно. Существует по крайней мере два способа решения задачи: поиск процессов идентичных себе и установка<strong>Mutex</strong>.</p>
3 <p>В<strong>WinAPI</strong>данная проблема решалась просто:<strong>WinMain</strong>получал указатель на прошлый экземпляр запущенной программы. В C# мне о такой возможности не известно. Существует по крайней мере два способа решения задачи: поиск процессов идентичных себе и установка<strong>Mutex</strong>.</p>
4 <h2>Оба способа имеют как преимущества, так и недостатки</h2>
4 <h2>Оба способа имеют как преимущества, так и недостатки</h2>
5 <p>В первом случае поиск осуществляется по имени процесса, но всегда можно переименовать программу перед повторным запуском. Во втором случае возможна атака за счёт генерации такого же<strong>Mutex</strong>злоумышленником.</p>
5 <p>В первом случае поиск осуществляется по имени процесса, но всегда можно переименовать программу перед повторным запуском. Во втором случае возможна атака за счёт генерации такого же<strong>Mutex</strong>злоумышленником.</p>
6 <h2>Рассмотрим оба способа</h2>
6 <h2>Рассмотрим оба способа</h2>
7 <p>Вариант с Mutex:</p>
7 <p>Вариант с Mutex:</p>
8 static bool IsSingleInstance() { bool flag; Mutex mutex = new Mutex(true, "MY_UNIQUE_MUTEX_NAME", out flag); return flag; }<p>Вариант с процессом:</p>
8 static bool IsSingleInstance() { bool flag; Mutex mutex = new Mutex(true, "MY_UNIQUE_MUTEX_NAME", out flag); return flag; }<p>Вариант с процессом:</p>
9 if (Process.GetProcesses().Count(x=&gt;x.ProcessName=="MyProcessName")&gt;1) Process.GetCurrentProcess.Kill();<p>Имя процесса можно узнать с помощью<strong>Process.GetCurrentProcess().ProcessName</strong>. Кроме того, для<strong>WindowsForms</strong>существует отдельный способ запуска ровно одной копии приложения, но он выходит за рамки данной заметки.</p>
9 if (Process.GetProcesses().Count(x=&gt;x.ProcessName=="MyProcessName")&gt;1) Process.GetCurrentProcess.Kill();<p>Имя процесса можно узнать с помощью<strong>Process.GetCurrentProcess().ProcessName</strong>. Кроме того, для<strong>WindowsForms</strong>существует отдельный способ запуска ровно одной копии приложения, но он выходит за рамки данной заметки.</p>
10 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
10 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
11  
11