2009-03-10 5 views

답변

3

. NET 프로그램에서 단일 인스턴스 응용 프로그램을 구현하는 잘 알려진 방법으로는 프로세스 메서드, Mutex 메서드 및 Visual Basic 메서드가 있습니다.

마이클 코 빙턴 (Michael Covington)은 그의 힌트에서 처음 두 개를 설명합니다 (Ensuring that only a single instance of a .NET application is running).

기존 응용 프로그램의 창 핸들을 가져 와서 (어떻게 든) 통신 할 수 있도록 Mutex 메서드에 대해 자세히 설명하는 CodeProject article이 있습니다.

또 다른 CodeProject article은 단일 인스턴스 응용 프로그램을 구현하기 위해 Microsoft.VisualBasic 네임 스페이스 (C#에서 액세스 할 수 있음)에서 클래스를 사용하는 방법을 설명합니다.

세 번째 방법에 익숙하지 않습니다. 첫 번째 두 개는 둘 다 작동하지만 링크 된 기사에서 지적한 바와 같이 Mutex 메서드는 더욱 강력 해 보입니다. 왜 Mutex가 명명 된 객체로 선택되었는지 모르겠습니다.명명 된 동기화 객체 (EventWaitHandle, Mutex, Semaphore 등)가 작동합니다.

기존 응용 프로그램과 통신 할 때 더 많은 문제가 발생합니다. 네가해야 할 일은 상대적으로 작은 메시지를 실행중인 어플리케이션으로 보내면된다. 자세한 내용은 System.IO.Pipes.NamedPipeClientStream을 확인하십시오.

보안이 걱정되는 경우 사용하는 통신 방법에 관계없이 보안을 설정해야합니다. 충분한 권한을 가진 응용 프로그램은 명명 된 파이프를 통해 실행중인 응용 프로그램에 정보를 보낼 수 있습니다.

0

이것이 최선의 방법인지 나는 모른다. 기본적으로 명명 된 뮤텍스를 보유 할 장소 인 싱글 톤 객체를 사용합니다. 응용 프로그램이 두 번 실행하려고하면 뮤텍스가 사용 중인지 확인하고 실행중인 경우 실행을 중지하므로 두 번 실행할 수 없습니다.

그러나 이미 실행중인 응용 프로그램과 대화하는 방법을 모르겠습니다.

1

.Net Remoting (.Net 2.0) 또는 WCF (.Net 3.5)를 사용하여 동일하거나 다른 컴퓨터의 프로그램간에 통신 할 수 있습니다.

이미 실행중인 프로그램에 명령 줄 인수를 전달할 수 없습니다. 원하는 모든 방법을 사용하여 원하는 모든 데이터를 전달할 수 있지만이 데이터를 의식적으로 처리해야합니다. 마술

0

는 "가 이미 실행중인 인스턴스에 명령 줄 인수를 전달하는 가장 좋은 방법이 무엇인지 (예를 들어 특정 문서를 열) 명령 행 인수로 사용되지 않습니다? 불행하게도

I 돈 이 응용 프로그램은 Console.ReadLine()을 사용하여 표준 입력에서 입력을 얻을 수 있지만 명령 행 인수를 전달하는 것과 동일하지는 않습니다.

다른 프로세스 간 통신 방법이 있습니다. .NET Remoting 및 WCF는 물론 사용자 지정 소켓 프로토콜을 사용합니다.

System.Diagnostics 네임 스페이스를 사용하여 실행중인 프로세스 목록을 수집 할 수 있습니다.

+0

첫 번째 (굵게 표시가 아닌) 단락은 혼란스럽고 (나는 그것이 의미하는 바를 실제로 이해하지 못함) 잘못된 것 사이에 있습니다. 다른 두 단락이 유효하기 때문에 나는 downvoted,하지만. – erikkallen

+0

혼란 스럽다면 그게 한 가지지만 그게 잘못이라는 것은 모르겠다. – Alan

+0

어쨌든, 나는 더 명확하게 그것을 편집했습니다. 프로그램이 시작된 후에는 명령 행 인수를 전달할 수 없지만 프로그램은 STDIN에서 입력을 읽도록 작성 될 수 있습니다. 이를 종종 "대화 형 모드"라고합니다. – Alan

-1

응용 프로그램이 실행 중인지 확인하려면 엄청난 오버 헤드가 있기 때문에 뮤텍스를 사용하지 마십시오. 사용

using System.Diagnostics; 

public bool IsProcessOpen(string name) 
{ 
    foreach (Process clsProcess in Process.GetProcesses) { 
     if (clsProcess.ProcessName.Contains(name)) return true; 
    } 
    return false; 
} 

이 "다른 응용 프로그램"에 대해 더 많은 정보를 제공할수록 좋습니다. "다른 응용 프로그램"을 개발했다면 다른 응용 프로그램에 일부 데이터를 직렬화하여 원하는 다른 정보를 알려줄 수 있습니다. .NET 프레임 워크 XMLSerializer를 확인하십시오. 데이터베이스 항목을 사용하는 것처럼 간단한 작업을 수행 할 수도 있습니다. UDP 패킷을 사용할 수 있습니다. 다른 프로그램과 의사 소통하는 데는 여러 가지 방법이 있습니다. 질문은, 다른 프로그램은 무엇입니까?

+1

이것은 뮤텍스보다 오버 헤드가 적다 고 진지하게 생각합니까? -1 증명할 때까지 -1. – erikkallen

관련 문제