C # 프로세스 대기 포리스트 예외


C # 프로세스 waitforexit 예외
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
왜 Process. WaitForExit가 "no process"를 던지겠습니까? 프로세스가 존재하는 경우에도 예외가 발생합니까?
이 코드가 포함 된 Windows 서비스가 있습니다.
이 코드의 목적은 문서에서 IFilter 추출물을 실행하는 것입니다. 일부 IFilter는 비정상적으로 벗겨지기 때문에 별도의 프로세스를 사용합니다.
이제이 코드는 Windows 7 및 Server 2008 R2 상자에서 완벽하게 실행되지만 Windows Server 2003에서는 WaitForExit이 "이 프로세스 개체와 연결된 프로세스가 없습니다."예외를 즉시 throw합니다. 프로세스가 존재하고 문제없이 작업을 완료합니다.
이걸 본 사람? WaitForExit이 왜이 오류를 발생시키는 지에 대해 누구나 알 수 있습니까?
이 코드를 콘솔 응용 프로그램에 배치하고 Windws Server 2003 상자에서도 제대로 실행하면 Windows Server 2003 상자의 Service에서이 문제를 실행하는 특정 문제 인 것처럼 보입니다.
프로세스를 시작할 때 System. Diagnostics. Process 클래스를 사용하면 시스템에서 CreateProcess 또는 ShellExecuteEx Win32 함수를 사용할 수 있습니다. CreateProcess를 사용하면 실행 파일 만 시작할 수 있습니다. ShellExecuteEx를 사용할 때, 쉘에서 "시작 -> 실행"명령을 사용하여 시작할 수있는 모든 파일.
그러나 이것들은 프로세스를 시작하는 완전히 다른 방법입니다. ShellExecuteEx는 셸을 포함하며, 예를 들어 HKCR \ & lt; progid & gt; \ shell \ & lt; 동사 & gt; 아래에 저장된 정보를 사용하여 Word 나 Excel의 기존 인스턴스를 다시 사용하여 문서를 열 수 있습니다. 레지스트리 키. 예를 들어 DDE를 사용하여 기존 Excel 인스턴스를 검색 한 다음 활성화 할 수 있습니다.
ShellExecuteEx의 SHELLEXECUTEINFO 문서를 참조하십시오.
ShellExecuteEx는 새 프로세스가 시작되었는지 여부에 따라 hProcess를 반환하거나 반환하지 않을 수 있습니다. 이것은 당신이보고있는 행동입니다.
CreateProcess는 하위 수준의 함수이며 직접 프로세스를 만들고 동일한 인수를 전달합니다. 항상 프로세스 핸들을 반환합니다.
참고 : 실행 파일을 시작한 것으로 보이기 때문에 ShellExecuteEx가 hProcess를 반환하지 않는다는 것이 약간 놀라운 일입니다. 그럼에도 불구하고 프로세스 핸들을 확보하려면 UseShellExecute = false를 사용하는 것이 올바른 작업입니다.

C # 프로세스 waitforexit 예외
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
Process. WaitForExit ()은 NullReferenceException을 발생시킵니다.
다음 코드는 NullReferenceException을 발생시킵니다.
디버거를 사용하면 Process. Start가 null을 반환하는 것을 볼 수 있습니다. 그래서 .. 왜 이런 일이 일어나고 있는지에 대한 생각은? 사용자가 시작한 프로세스를 완료 할 때까지 프로그램 실행을 차단하고 싶습니다.
업데이트 :이 코드를 리펙토링 :
이 예외가 발생합니다.
InvalidOperationException :이 개체와 연결된 프로세스가 없습니다.
MSDN에서 Process. Start가 반환됩니다.
프로세스 리소스가 시작되지 않은 경우 (예 : 기존 프로세스가 다시 사용되는 경우) 프로세스 리소스 또는 null 참조 (Visual Basic의 경우 Nothing)과 관련된 새 Process 구성 요소입니다.
귀하의 경우, 실행 파일보다는 Process. Start에 URL을 전달하기 때문에 실제로 새 프로세스를 시작하지는 않습니다. URL을 iexplore 또는 브라우저가 무엇이든간에 전달하고 있습니다. 그래서 당신은 null을 돌려받습니다.
어쨌든 "시작된 프로세스로 사용자가 완료 될 때까지 프로그램 실행을 차단하는 것"은 무엇을 의미합니까? 사용자가 웹 브라우저를 닫을 때까지 기다리시겠습니까? 이 경우 다음과 같은 것이 필요할 수 있습니다.
. 그것은 나를 위해 적절하게 작동합니다. 그러나 브라우저 실행 파일을 지정해야합니다.

C # 프로세스 waitforexit 예외
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
& quot; 프로세스가 종료되었습니다 & quot;가 표시되지 않고 프로세스를 종료하는 방법 예외?
Process. Kill ()을 사용하여 프로세스를 종료합니다. 이렇게 :
그리고 때로는 프로세스가 줄 사이에서 빠져 나오기 때문에 컨트롤이 안에 들어가서 Kill이 예외를 생성합니다.
이제 try-catch로 코드를 래핑하는 것은 다른 이유 때문에 InvalidOperationException을 호출 할 수 있기 때문에 좋은 생각으로 보이지 않습니다.
설명 된 시나리오에서 예외가 발생하지 않고 프로세스를 종료 할 수있는 방법이 있습니까?
당신은 P / Invoke TerminateProcess를 Process. Handle에 넘길 수 있습니다. 그런 다음 수동으로 원인을 평가합니다 (GetLastError ()). 대략 Process. Kill ()이 내부적으로하는 일은 대략적입니다.
그러나 TerminateProcess는 비동기입니다. 따라서 처리가 완료되었는지 프로세스 핸들을 기다려야합니다. Process. Kill ()을 사용하면 해당 작업을 수행합니다.
업데이트 : 수정, Process. Kill () 또한 비동기 적으로 실행됩니다. 따라서 WaitForExit ()을 사용하여 종료가 완료 될 때까지 기다려야합니다.
솔직히, 나는 신경 쓰지 않을 것이다. 물론 어떤 "임의"InvalidOperationExcepion이 더 이상 존재하지 않는 프로세스 또는 유효하지 않은 상태에있는 Process 개체와 관련이없는 코드 줄에서 벗어나기는 항상 (원격?) 가능성이 있습니다. 현실 나는 당신이 단지 죽이기를 시도 / 잡을 수 있다고 생각합니다.
또한 응용 프로그램에 따라 어쨌든이 결과를 기록하는 것을 고려할 수 있습니다. 이는 최후의 수단으로 판단되기 때문입니다. 이 경우 실제 InvalidOperationException을 기록하십시오. 일이 이상 해지면 최소한 킬이 실패한 이유를 확인하기위한 로그를 남기십시오.
위와 같은 이유 때문에 Win32Exception을 포착 / 처리하는 것이 좋습니다.

C # 프로세스 waitforexit 예외
Process. Start () 메서드를 사용하여 다른 Exe를 시작하는 콘솔 응용 프로그램을 만들었습니다. Exe 2에서 예외를 발생 시키면 Exe1을 catch해야합니다. 다음은 내가 작성한 코드입니다.
static void Main (string [] args)
string arguments = string. Empty;
foreach (args의 문자열 strData)
string. Format ( "", arguments, strData);
프로세스 notePad = 새 프로세스 ();
SecureString secure = 새로운 SecureString ();
foreach ( "password"의 char c)
ProcessStartInfo startInfo = 새로운 ProcessStartInfo ();
using (프로세스 exeProcess = Process. Start (startInfo))
string. Format ( "-"LaunchModelCatalogueApp에서 예외 발생 : ", ex. Message), EventLogEntryType. Information);
정적 클래스 프로그램.
static void Main (string [] args)
Exe 2에서 예외가 발생하면 Exe 1을 catch해야합니다. 어떻게해야합니까?
감사합니다.
예외는 전체 프로세스 내 기능입니다.
표준 패러다임은 실행 파일이 주 메소드의 리턴 코드를 리턴하도록하는 것입니다. 0을 반환하면 성공적으로 완료되고, 다른 것이 반환되면 오류가 발생합니다. 반환 된 특정 번호는 오류 유형을 나타내는 데 사용할 수 있습니다. 여러 유형의 오류에 대한 정보를 신경 쓰지 않으면 오류를 반환하십시오.
이렇게하려면 main 메소드를 int Main 대신 void Main으로 변경하십시오. 메인 메소드 전체를 try / catch로 둘러 쌉니다. catch에서 return 1은 try가 끝날 때 0을 반환합니다.
Process 클래스의 ExitCode 속성을 사용하여 호출 응용 프로그램에서 값을 읽을 수 있습니다.
Dummy yoyo 님의 답변으로 표시 중재자 2012 년 1 월 24 일 화요일 오전 8:40.
Process. Start를 사용하여 새로운 프로세스를 시작하면 다른 프로세스에서 던져진 예외를 잡을 방법이 없습니다. 이를 위해서는 IPC (Inter Process Communication) 기술이 필요합니다. 원격 또는 Windows 통신 기반을 사용할 수 있습니다.
클라이언트 / 서버 응용 프로그램에서 예외를 잡는 방법에 대한 그물에 관한 많은 기사를 찾을 수 있습니다.
나는 이것이 당신을 돕기를 바랍니다.
문제를 해결 한 경우이 게시물을 답변으로 표시하십시오. 해피 프로그래밍!
Sarathi R 님이 작성한 답변 2012 년 1 월 16 일 월요일 오전 10:43 Dummy yoyo의 답변으로 표시 2012 년 1 월 24 일 화요일 오전 8:40.
또 다른 간단한 접근법은 텍스트 파일에 예외를 기록하고 원하는 곳 어디에서든지 읽는 것입니다.
이 게시물에서 질문에 대한 답변을 얻으려면 & quot; 답변으로 표시 & quot;를 클릭하십시오. . 이 게시물이 도움이된다면 & quot; 유용한 정보로 표시 & quot;를 클릭하십시오. .
Dummy yoyo 편집자 편집자 2012 년 1 월 16 일 월요일 오전 8:21 링크를 편집하여 사용 가능하게 만드십시오. Dummy yoyo 님의 답변으로 표시 중재자 2012 년 1 월 24 일 화요일 오전 8:40.
감사합니다 Servy, 내가 ExitCode에 대해 알고 있고 나는 또한 피곤했습니다. 하지만 문제는 예외가 발생했기 때문에 코드의 도움으로 정확한 예외를 반환 할 수 없다는 것입니다.
감사합니다.
더 많은 양의 정보를 보내기 위해 표준 출력 또는 표준 오류 스트림을 사용할 수 있습니다. 이 경우 표준 오류가 가장 적합합니다. (exit 코드와 함께 사용해야합니다.) catch 블록의 표준 오류에 대한 예외를 출력하고, 호출 프로그램에서 출력 스트림을 리디렉션하고, 오류 스트림에서 읽습니다 (종료 코드가 있으면 무시). 0).
프로세스의 출력을 읽을 때 교착 상태가 발생했는지 확인하십시오. 특히 다른 두 스트림에서 읽는 경우 특히 그렇습니다. 프로세스의 MSDN 페이지에 몇 가지 일반적인 함정이 설명되어 있습니다.
Dummy yoyo 님의 답변으로 표시 중재자 2012 년 1 월 24 일 화요일 오전 8:40.
모든 답장.
Process. Start를 사용하여 새로운 프로세스를 시작하면 다른 프로세스에서 던져진 예외를 잡을 방법이 없습니다. 이를 위해서는 IPC (Inter Process Communication) 기술이 필요합니다. 원격 또는 Windows 통신 기반을 사용할 수 있습니다.
클라이언트 / 서버 응용 프로그램에서 예외를 잡는 방법에 대한 그물에 관한 많은 기사를 찾을 수 있습니다.
나는 이것이 당신을 돕기를 바랍니다.
문제를 해결 한 경우이 게시물을 답변으로 표시하십시오. 해피 프로그래밍!
Sarathi R 님이 작성한 답변 2012 년 1 월 16 일 월요일 오전 10:43 Dummy yoyo의 답변으로 표시 2012 년 1 월 24 일 화요일 오전 8:40.
예, 이것은 매우 좋은 개념입니다. 이전 프로젝트 중 하나를 적용했습니다. 당신은 예외를 통해해야하고 예외 파생 클래스에서 그것을 잡아야한다. 예를들 수 있습니다. / codecroject / KB / dotnet / unhandledexceptions. aspx 링크를 확인할 수 있습니다.
& ldquo; 답으로 표시 & rdquo;를 클릭하십시오. 이 게시물을 읽는 다른 커뮤니티 회원에게 유용 할 수 있습니다.
KashNetDev 편집자 2012 년 1 월 12 일 목요일 오전 6:26
Adavesh와 Kash에게 감사드립니다.
예외는 전체 프로세스 내 기능입니다.
표준 패러다임은 실행 파일이 주 메소드의 리턴 코드를 리턴하도록하는 것입니다. 0을 반환하면 성공적으로 완료되고, 다른 것이 반환되면 오류가 발생합니다. 반환 된 특정 번호는 오류 유형을 나타내는 데 사용할 수 있습니다. 여러 유형의 오류에 대한 정보를 신경 쓰지 않으면 오류를 반환하십시오.
이렇게하려면 main 메소드를 int Main 대신 void Main으로 변경하십시오. 메인 메소드 전체를 try / catch로 둘러 쌉니다. catch에서 return 1은 try가 끝날 때 0을 반환합니다.
Process 클래스의 ExitCode 속성을 사용하여 호출 응용 프로그램에서 값을 읽을 수 있습니다.
Dummy yoyo 님의 답변으로 표시 중재자 2012 년 1 월 24 일 화요일 오전 8:40.
감사합니다 Servy, 내가 ExitCode에 대해 알고 있고 나는 또한 피곤했습니다. 하지만 문제는 예외가 발생했기 때문에 코드의 도움으로 정확한 예외를 반환 할 수 없다는 것입니다.
감사합니다.
또 다른 간단한 접근법은 텍스트 파일에 예외를 기록하고 원하는 곳 어디에서든지 읽는 것입니다.
이 게시물에서 질문에 대한 답변을 얻으려면 & quot; 답변으로 표시 & quot;를 클릭하십시오. . 이 게시물이 도움이된다면 & quot; 유용한 정보로 표시 & quot;를 클릭하십시오. .
Dummy yoyo 편집자 편집자 2012 년 1 월 16 일 월요일 오전 8:21 링크를 편집하여 사용 가능하게 만드십시오. Dummy yoyo 님의 답변으로 표시 중재자 2012 년 1 월 24 일 화요일 오전 8:40.
감사합니다 Servy, 내가 ExitCode에 대해 알고 있고 나는 또한 피곤했습니다. 하지만 문제는 예외가 발생했기 때문에 코드의 도움으로 정확한 예외를 반환 할 수 없다는 것입니다.
감사합니다.
더 많은 양의 정보를 보내기 위해 표준 출력 또는 표준 오류 스트림을 사용할 수 있습니다. 이 경우 표준 오류가 가장 적합합니다. (exit 코드와 함께 사용해야합니다.) catch 블록의 표준 오류에 대한 예외를 출력하고, 호출 프로그램에서 출력 스트림을 리디렉션하고, 오류 스트림에서 읽습니다 (종료 코드가 있으면 무시). 0).
프로세스의 출력을 읽을 때 교착 상태가 발생했는지 확인하십시오. 특히 다른 두 스트림에서 읽는 경우 특히 그렇습니다. 프로세스의 MSDN 페이지에 몇 가지 일반적인 함정이 설명되어 있습니다.
Dummy yoyo 님의 답변으로 표시 중재자 2012 년 1 월 24 일 화요일 오전 8:40.
Microsoft는 Msdn 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 실시하고 있습니다. 참여를 선택하면 Msdn 웹 사이트를 탈퇴 할 때 온라인 설문 조사가 제공됩니다.

Comments