.NET에서 동일한 프로그램의 인스턴스가 이미 실행되고 있는지를 가장 안정적으로 감지하는 방법은 무엇입니까? 또한 이미 실행중인 인스턴스 (예 : 특정 문서 열기)에 명령 줄 인수를 전달하는 가장 좋은 방법은 무엇입니까?실행중인 프로그램 인스턴스 검색 및 정보 전달
답변
. 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을 확인하십시오.
보안이 걱정되는 경우 사용하는 통신 방법에 관계없이 보안을 설정해야합니다. 충분한 권한을 가진 응용 프로그램은 명명 된 파이프를 통해 실행중인 응용 프로그램에 정보를 보낼 수 있습니다.
이것이 최선의 방법인지 나는 모른다. 기본적으로 명명 된 뮤텍스를 보유 할 장소 인 싱글 톤 객체를 사용합니다. 응용 프로그램이 두 번 실행하려고하면 뮤텍스가 사용 중인지 확인하고 실행중인 경우 실행을 중지하므로 두 번 실행할 수 없습니다.
그러나 이미 실행중인 응용 프로그램과 대화하는 방법을 모르겠습니다.
.Net Remoting (.Net 2.0) 또는 WCF (.Net 3.5)를 사용하여 동일하거나 다른 컴퓨터의 프로그램간에 통신 할 수 있습니다.
이미 실행중인 프로그램에 명령 줄 인수를 전달할 수 없습니다. 원하는 모든 방법을 사용하여 원하는 모든 데이터를 전달할 수 있지만이 데이터를 의식적으로 처리해야합니다. 마술
는 "가 이미 실행중인 인스턴스에 명령 줄 인수를 전달하는 가장 좋은 방법이 무엇인지 (예를 들어 특정 문서를 열) 명령 행 인수로 사용되지 않습니다? 불행하게도
I 돈 이 응용 프로그램은 Console.ReadLine()을 사용하여 표준 입력에서 입력을 얻을 수 있지만 명령 행 인수를 전달하는 것과 동일하지는 않습니다.
다른 프로세스 간 통신 방법이 있습니다. .NET Remoting 및 WCF는 물론 사용자 지정 소켓 프로토콜을 사용합니다.
System.Diagnostics 네임 스페이스를 사용하여 실행중인 프로세스 목록을 수집 할 수 있습니다.
응용 프로그램이 실행 중인지 확인하려면 엄청난 오버 헤드가 있기 때문에 뮤텍스를 사용하지 마십시오. 사용
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. – erikkallen
- 1. 머신에서 실행중인 CLR 및 GC 인스턴스 수?
- 2. 클라이언트 컴퓨터에서 실행중인 응용 프로그램
- 3. 단일 인스턴스 응용 프로그램에서 실행중인 인스턴스 표시
- 4. 안드로이드 개발 : 정보 전달
- 5. Sinatra의 인스턴스 스코프에서 실행중인 메소드
- 6. 실행중인 프로세스의 이름 검색
- 7. 실행중인 R 런타임에 명령을 전달
- 8. 실행 파일 정보 검색
- 9. HTML 및 jQuery 정보 전달 디자인
- 10. Resharper - 유형의 인스턴스 검색
- 11. 하나의보기에서 다른보기로 정보 전달
- 12. Windows간에 정보 전달 ASP.net
- 13. 보기간에 정보 전달
- 14. Asp.net : 클라이언트 정보 전달
- 15. Facebook에서 UITabBarController로 정보 전달
- 16. jqModal에 정보 전달
- 17. divs 정보 전달
- 18. 변경 키 쌍 ec2 실행중인 인스턴스
- 19. 동일한 응용 프로그램 인스턴스 열기
- 20. 실험실 정보 시스템에 대한 정보 검색
- 21. 다중 인스턴스 대 단일 인스턴스 응용 프로그램
- 22. 실행중인 응용 프로그램 모니터링
- 23. git 브랜치와 실행중인 프로그램
- 24. 실행중인 프로그램 종료 문제
- 25. 세션없이 실행중인 프로그램
- 26. 백그라운드에서 실행중인 프로그램 (JAVA)
- 27. 백그라운드에서 실행중인 응용 프로그램
- 28. 실행중인 프로그램 창 숨기기
- 29. 브라우저 정보 검색 및 구문 분석을위한 라이브러리
- 30. Ajax를 사용하여 정보 게시 및 검색
첫 번째 (굵게 표시가 아닌) 단락은 혼란스럽고 (나는 그것이 의미하는 바를 실제로 이해하지 못함) 잘못된 것 사이에 있습니다. 다른 두 단락이 유효하기 때문에 나는 downvoted,하지만. – erikkallen
혼란 스럽다면 그게 한 가지지만 그게 잘못이라는 것은 모르겠다. – Alan
어쨌든, 나는 더 명확하게 그것을 편집했습니다. 프로그램이 시작된 후에는 명령 행 인수를 전달할 수 없지만 프로그램은 STDIN에서 입력을 읽도록 작성 될 수 있습니다. 이를 종종 "대화 형 모드"라고합니다. – Alan