Блокировка второй копии своего приложения.

Добрый день дорогие пользователи 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;
		}
	}
}

 

 

Обновлено: 28.04.2017 — 12:45

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.