[C#] MemoryMappedFile 을 이용한 프로그램 중복 실행 방지
2014. 3. 4. 20:31ㆍCoders
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()); } } } }
'Coders' 카테고리의 다른 글
[C#] JSON -> DataTable 변환시 DBNull 문제 (0) | 2014.03.05 |
---|---|
[C#] 스플래시 윈도를 만들었는데 자꾸 뒤로 숨는다면? (0) | 2014.02.26 |
[C#] 나 자신의 Build(Link) 시간을 알고 싶을 때 (0) | 2013.12.27 |