관리되지 않는 앱을 감지하는 방법이 중단되었습니다
-
20-08-2019 - |
문제
Process.Start ()를 통해 관리되지 않는 C ++ 응용 프로그램을 호출하는 C# 앱이 있습니다.
일부 컴퓨터 에서이 C ++ 앱이 중단되면 방금 오류 대화 상자가 표시됩니다.
C#에서 C ++ 앱이 잘못되었음을 감지하고 다시 시작하는 방법이 있습니까?
(소스가 없으므로 C ++ 앱을 수정할 수 없습니다)
해결책
C ++ 앱이 어떤 식 으로든 충돌했기 때문에 JIT 디버거 대화 상자가 표시됩니다. 대화 상자가 열려있는 동안 프로세스가 여전히 존재하지만 (하지만 중단)이므로 프로세스 클래스는 JIT 대화가 기각되거나 첨부 된 디버거가 프로세스를 종료 할 때까지 "종료"할 것이라고 생각하지 않습니다.
문제가 발생한 기계에서 JIT 디버깅을 비활성화 할 수 있습니다 (I 생각한다 이 기계 디버그 관리자 서비스를 비활성화하면 JIT 디버깅이 비활성화 될 수 있습니다. 앱이 충돌 및 죽을 수있게되면 (따라서 "종료 된"것으로보고), 또는 (그리고 어떻게이 작업을 수행 할 것인지 전혀 모른다) 호스트 C# 앱이 C ++ 앱의 디버거로 첨부하고 C ++ 앱에서 충돌 알림을받은 다음 종료 한 다음 종료 된 정보에 따라 작동 할 수 있습니다.
다른 팁
C ++가 콘솔 기반 인 경우 두 가지를 확인할 수 있습니다.
exitcode, 일반적으로 0은 일반적으로 닫히는 것을 의미합니다. 그렇지 않으면 문제가 있습니다 (그러나 이것은이 응용 프로그램을 개발하는 데 사용되는 규칙에 달려 있다고 생각합니다).
표준 오류가 비어 있으면 모든 것이 정상입니다.
사용 (프로세스 p = new Process ()) {
p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.FileName = "any.exe"; p.Start(); string error = p.StandardError.ReadToEnd(); p.WaitForExit() if(error.Length == 0 && p.ExitCode == 0) { } }