2014-04-15 2 views
0

두 개의 다른 응용 프로그램에서 작업하고 있습니다.다른 응용 프로그램의 한 응용 프로그램에서 오류를 캡처하는 방법이 있습니까

응용 프로그램 1 솔루션에서 응용 프로그램 2 프로세스 (.exe 파일)를 호출하려고합니다. 응용 프로그램 2에서 "잘못된 사용자 이름 및 암호"오류가 발생하면 응용 프로그램 1 솔루션에서 해당 오류 예외를 catch하고 싶습니다.

다른 응용 프로그램에서 하나의 응용 프로그램에

내 응용 프로그램 오류를 캡처 할 수있는 방법은 프로세스 경계 사이에 C# 윈도우 응용 프로그램

+0

트릭은 응용 프로그램 1이 응용 프로그램 2의 오류로 수행하고자하는 작업을 정확하게 알려주는 것입니다. 응용 프로그램 1에서 오류가 발생하지 않았는지 확인 하시겠습니까? 아니면 오류를 기록하고 싶지 않습니까? . –

답변

1

당신은 할 수 던져 - 캐치 거기입니다. 프로세스 간 통신 기술을 사용해야합니다. 귀하의 상황에 따라 선택할 수있는 사람들이 많이 있습니다. 공정 프로세스 B가 듣고 로그 파일에 기록 : 여기

  1. 파일은 ... 일부 옵션의 목록입니다. 매우 쉽게 구현할 수 있습니다.
  2. 명명 된 파이프 또는 TCP/IP 소켓 : 두 개의 프로세스를 명명 된 파이프 또는 소켓과 함께 연결하고 한 응용 프로그램에서 다른 응용 프로그램으로 유선을 통해 데이터를 전송할 수 있습니다.
  3. 메시지 대기열 : 프로세스 A는 프로세스 B가 메시지를 푸시하는 메시지 대기열을들을 수 있습니다.
  4. 데이터베이스 : 프로세스 A가 데이터베이스를 검사하는 동안 프로세스 A가 데이터베이스에 쓸 수 있습니다. 이것은 원격 데이터베이스 또는 SQLite 데이터베이스처럼 단순한 것일 수 있습니다.

파일 또는 명명 된 파이프를 사용하면 해결하려는 작업을 수행하는 가장 쉬운 방법입니다. 다른 옵션은 환경 및 요구 사항에 따라 다릅니다.

0

요르단 솔루션에 추가하면 콘솔 2에서 Application2 스트림을 읽을 수 있습니다.

참조 :. 당신이 실제로 다른 프로세스를 시작하는 것이 아니라 실행 파일을 실행하는 기존의 프로세스 내에서 별도의 응용 프로그램 도메인을 생성하지 않는 경우에 당신은 그것을 할 수 ...의 http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.110).aspx

// Start the child process. 
Process p = new Process(); 
// Redirect the output stream of the child process. 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.FileName = "Write500Lines.exe"; 
p.Start(); 
// Do not wait for the child process to exit before 
// reading to the end of its redirected stream. 
// p.WaitForExit(); 
// Read the output stream first and then wait. 
string output = p.StandardOutput.ReadToEnd(); 
p.WaitForExit(); 
1

현물 " 내부 "실행 파일은 CLR 어셈블리 여야합니다. 프로세스 간 예외 처리가 가능하지 않다는 것을 나타내는 다른 대답은 정확합니다. 이 접근법은 문제를 해결하는 동안 잘 작동하는 당신에게 행동을 제공하면서 작동합니다.

정상적으로 프로세스를 시작하면 원하는 것을 얻을 수 없습니다.

var process = Process.Start("MyInnerProcess.exe"); 

당신은 당신에게 프로세스에 대한 육즙 모든 종류의 정보를 제공하고 당신이 일을 표준 출력 스트림에 기록되는 모니터링 할 수있는 프로세스 개체를 다시 얻을 것이다 ...하지만 예외에 대한 실제 액세스 내에서 발생하지 과정.

그러나 새 AppDomain을 처음 실행하여 어셈블리를 시작하면 실행 중에 해당 어셈블리에서 throw 된 모든 예외 (처리되지 않은 상태와 첫 번째 가능성 모두)에 대한 알림을 쉽게받을 수 있습니다. (참고 : 이러한 예외 사항에 대해 수행 할 수있는 방법은 없지만 이러한 상황이 발생하고 있음을 알 수 있습니다.예외가 다른 과정에서 발생 될 때마다

var innerDomain = AppDomain.CreateDomain("InnerDomain"); 
try 
{ 
    //Subscribe to the events you are interested in  
    innerDomain.UnhandledException += innerDomain_UnhandledException; 
    innerDomain.FirstChanceException += innerDomain_FirstChanceException; 

    //Execute your assembly within the app domain 
    innerDomain.ExecuteAssembly("MyInnerProcess.exe"); 
} 
catch (Exception ex) 
{ 
    //Handle exceptions when attempting to launch the process itself. 
} 

void innerDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    //Do something with the unhandled exceptions 
} 
void innerDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e) 
{ 
    //Do something with the first chance exceptions 
} 

하는 것은 이제, 당신이 그 예외에 대한 액세스를 얻을 것이다 :)

여기에 코드입니다. FirstChanceException 핸들러는 모든 예외에 대해 호출됩니다 (응용 프로그램 내에서 제대로 처리 되더라도). 따라서 구독하지 않을 수도 있습니다. 아마 UnhandledException 이벤트에 관심이있을 것입니다. 또한 처리되지 않은 모든 예외는 FirstChanceException을 발생시키고 (처리되는 경우) 처리되지 않고 계속 거품을 내면 UnhandledException을 발생시킵니다.

+0

니스! 굉장한 첫 번째 게시물. – BenjaminPaul

관련 문제