Добрый день дорогие пользователи nookery.ru! Сегодня поговорим о том как запретить пользователю запускать вторую копию своей программы. С этой проблемой часто сталкиваются начинающие программисты, на самом деле решение не совсем тривиальное и имеет несколько решений, давайте рассмотрим их.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace NotTwoCopy
{
class Program
{
static Mutex m_mutex;
[STAThread]
static void Main(string[] args)
{
if (InstanceExists())
{
return;
}
Console.WriteLine("Приложение запущено, нажмите Enter для закрытия приложения");
Console.ReadLine();
}
static bool InstanceExists()
{
bool createdNew;
m_mutex = new Mutex(false, "OneInstanceApplication", out createdNew);
return(!createdNew);
}
}
}
Тут мы создаем именованный объект Mutex. Который позволяет определить запущенна ли копия программы, и в случаи запуска копи закрывает ее.
Еще один вариант это проверка всех запущенных процессов по имени, и в случаи нахождения копии мы ее закрываем.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
//www.nookery.ru
namespace NotTwoCopy
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Process process = RunningInstance();
if (process!=null)
{
Console.WriteLine("Программа уже запущена");
return;
}
Console.WriteLine("Приложение запущено, нажмите Enter для закрытия приложения");
Console.ReadLine();
}
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//перебираем все процессы
foreach (Process process in processes)
//Игнорируем текущий процесс
if (process.Id != current.Id)
{
//Делаем проверку, на то что бы определить запущен ли процесс из того же файла
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
// Да, это и есть копия нашего приложения
return process;
}
}
//Индетичный процессов не найдено
return null;
}
}
}
