[C#] MemoryMappedFile 을 이용한 프로그램 중복 실행 방지

2014. 3. 4. 20:31Coders

C# 프로그램 중복 실행 방지 이라는 검색어로 구글에서 검색을 해 보면,

① 단순히 프로세스를 체크하거나, ② 뮤텍스를 사용하거나 등의 방법이 나옵니다.

찾아 보면, http://beautyrain.tistory.com/22 이 글에 잘 나와 있네요.


그런데,

 단순히 프로세스를 체크하는 경우, 우연찮게도 같은 프로세스명을 만나게 되면, 정작 내가 실행해야 할 프로세스를(프로그램을) 실행시키지 못합니다.

② 뮤텍스를 사용하는 경우가 확실하긴 하지만, 프로그램이 이상 종료되거나 할 경우, 해당 뮤텍스를 Release 하지 못하여 실패하는 경우도 있을 수 있습니다.


②의 경우, 응용프로그램의 주 진입점(Program.Main())에서 try~catch~finally 를 잘 사용하면 뭐 되겠지만, MemoryMapFile을 이용한 방법이 있어 소개하고자 합니다. 제가 종종 써 먹는 방법입니다. 프로그램 실행 시, 메모리맵 파일이 생성되었는지 확인하고, 해당 메모리맵 파일을 찾을 수 없으면, (내가 생성하니 않은 것이 되므로) 메모리맵 파일을 생성하면서 내 윈폼 프로그램을 실행하는 방법입니다.


덧붙여, 이 예제에서는 메모리맵 파일을 그냥 더미(Dummy) 용도로 사용했으나, 여러 개의 exe 가 하나의 자원을 공유하고자 할 때에 저 메모리맵 파일에 의미있는 데이터를 직렬화 하여 넣어서 사용하는 팁도 있습니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
//System.IO.MemoryMappedFiles 네임스페이스를 붙여줍니다.
using System.IO.MemoryMappedFiles;

namespace NoDuplicateExecute
{
	static class Program
	{
		/// 
		/// 해당 응용 프로그램의 주 진입점입니다.
		/// 
		[STAThread]
		static void Main()
		{
			//대충... 유니크할 법한 파일 명을 써 줍니다.
			const string uniqueFileName = "BA71871B-39CE-4A09-8AD6-003B86004C7C";

			try
			{
				//메모리맵 파일이 있다 치고, 오픈 시도
				using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting(uniqueFileName))
				{
					//여기에 Win32 API 등을 잘 이용하여 실행되고 있는 프로세스를 맨 앞으로 가져오면 됩니다.
					MessageBox.Show("이미 실행중 입니다.");
					return;
				}
			}
			catch (System.IO.FileNotFoundException)
			{
				//FileNotFoundException 예외가 발생하면, 메모리맵 파일이 없는 것이므로, 계속 진행
			}

			//메모리맵 파일을 생성하고, 내 윈폼 실행
			using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(uniqueFileName, 1))
			{
				//실행
				Application.EnableVisualStyles();
				Application.SetCompatibleTextRenderingDefault(false);
				Application.Run(new Form1());
			}
		}
	}
}