2016-09-02 11 views
2

私はC#を使用してコンソールアプリケーションを作成しましたが、別のWindowsフォームアプリケーションからProcessを使用して呼び出しました。以下はプロセスのエラー処理C#

は、コンソールアプリケーション

以下
static void Main(string[] args) 
     { 
      try 
      { 
       // ...my code 
      } 
      catch (Exception) 
      { 

       throw; 
      } 
     } 

のための私のコードで呼び出しのためのコードは、私が欲しいもの、プロセス

public void CallExe() 
    { 
     try 
     {        
      Process proc = new Process(); 
      proc.StartInfo.FileName = @"D:\Debug\console1.exe"; 
      proc.StartInfo.Arguments = "My args"; 
      proc.StartInfo.CreateNoWindow = true; 
      proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.RedirectStandardOutput = true; 
      proc.StartInfo.UseShellExecute = false; 
      proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      proc.Start();    
      proc.WaitForExit();    
      string stdout = proc.StandardOutput.ReadToEnd(); 
      string stderr = proc.StandardError.ReadToEnd(); 
      proc = null; 
     } 

     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 

を使用して、ウィンドウアプリケーションからコンソールアプリケーションのexeファイルの場合に任意のエラーですコンソールアプリケーションから来る それは直接私のウィンドウのアプリケーションキャッチブロックにスローされます。または、コンソールアプリケーションでスローされたウィンドウアプリケーションにエラーメッセージが表示されますか?

+1

ます別のプロセスで発生したエラーを検出することはできませんが、コンソールアプリケーションから終了コードを返すことはできません。 – stuartd

+0

コンソールアプリケーションからex.messageを入手できますか? –

+1

[終了コードを指定する](http://stackoverflow.com/questions/155610/how-do-i-specify-the-exit-code-of-a-console-application-in-net)が可能です。整数を取得し、[Process.ExitCode'](https://msdn.microsoft.com/en-us/library/system.diagnostics.process.exitcode(v = vs.110).aspx)から取得します。または、標準出力または標準エラー – stuartd

答えて

1

実行中のプロセスから何もキャプチャしていません。両方のストリームでReadToEndを呼び出すことはできません。どちらか一方が結果を生成するのをブロックするためです。 stdoutをstderrとして取得する場合は、DataReceivedイベントを購読し、イベント引数からデータを格納する必要があります。あなたは今、stderrに書いて、あなたが好きな場合は終了コードを設定することができ、テストコンソールアプリケーションで

Process proc = new Process(); 
proc.StartInfo.FileName = @"console.exe"; 
proc.StartInfo.Arguments = "My args"; 
proc.StartInfo.CreateNoWindow = false; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

//store outcome of process 
var errors = new StringBuilder(); 
var output = new StringBuilder(); 
var hadErrors = false; 

// raise events 
proc.EnableRaisingEvents = true; 

// capture normal output 
proc.OutputDataReceived += (s, d) => { 
    output.Append(d.Data); 
}; 

// Capture error output 
proc.ErrorDataReceived += (s, d) => { 
    if (!hadErrors) 
    { 
     hadErrors = !String.IsNullOrEmpty(d.Data); 
    } 
    errors.Append(d.Data); 
}; 

proc.Start(); 
// start listening on the stream 
proc.BeginErrorReadLine(); 
proc.BeginOutputReadLine(); 

proc.WaitForExit(); 
string stdout = output.ToString(); 
string stderr = errors.ToString(); 

if (proc.ExitCode !=0 || hadErrors) 
{ 
    MessageBox.Show("error:" + stderr); 
} 

を::

あなたの窓に以下のコードは、アプリケーションがこのようになっているはず形成

try 
{ 
    Console.WriteLine("Ready ..."); 
    var cmd = Console.ReadLine(); 
    if (cmd == "e") 
    { 
     throw new Exception("boom"); 
    } else 
    { 
     Console.WriteLine("success!"); 
    } 
    Environment.ExitCode = 0; 
} 
catch(Exception e) 
{ 
    // write to stderr 
    Console.Error.WriteLine(e.Message); 
    // exit code to 1 
    Environment.ExitCode = 1; 
} 
関連する問題