Como obter a mensagem de erro com c #

Para vsinstr -coverage hello.exe , posso usar o código C # da seguinte maneira.

 Process p = new Process(); StringBuilder sb = new StringBuilder("/COVERAGE "); sb.Append("hello.exe"); p.StartInfo.FileName = "vsinstr.exe"; p.StartInfo.Arguments = sb.ToString(); p.Start(); p.WaitForExit(); 

Quando há um erro, recebo a mensagem de erro: Error VSP1018: VSInstr does not support processing binaries that are already instrumented. .

Como posso obter essa mensagem de erro com c #?

RESOLVIDO

Eu poderia pegar as mensagens de erro das respostas.

 using System; using System.Text; using System.Diagnostics; // You must add a reference to Microsoft.VisualStudio.Coverage.Monitor.dll namespace LvFpga { class Cov2xml { static void Main(string[] args) { Process p = new Process(); p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.UseShellExecute = false; StringBuilder sb = new StringBuilder("/COVERAGE "); sb.Append("helloclass.exe"); p.StartInfo.FileName = "vsinstr.exe"; p.StartInfo.Arguments = sb.ToString(); p.Start(); string stdoutx = p.StandardOutput.ReadToEnd(); string stderrx = p.StandardError.ReadToEnd(); p.WaitForExit(); Console.WriteLine("Exit code : {0}", p.ExitCode); Console.WriteLine("Stdout : {0}", stdoutx); Console.WriteLine("Stderr : {0}", stderrx); } } } 

   

Você precisa redirect a saída padrão ou o erro padrão. Aqui está um exemplo de código para stdout:

 Process p = new Process(); p.StartInfo.FileName = "hello.exe"; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.UseShellExecute = false; p.Start(); string stdout = p.StandardOutput.ReadToEnd(); p.WaitForExit(); 

Você precisa redirect o StdError e ler o stream para detectar os erros.

 System.Diagnostics.ProcessStartInfo processStartInfo = new System.Diagnostics.ProcessStartInfo("MyExe.exe", "parameters ..."); int exitCode = 0; processStartInfo.RedirectStandardError = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.CreateNoWindow = true; processStartInfo.UseShellExecute = false; System.Diagnostics.Process process = System.Diagnostics.Process.Start(processStartInfo); process.WaitForExit(); //wait for 20 sec exitCode = process.ExitCode; string stdout = process.StandardOutput.ReadToEnd(); string stderr = process.StandardError.ReadToEnd(); // you should see the error string in stdout or stderr depending // on how your console applicatione decided to output the failures. 

Você tem que recuperar a saída padrão / erro do processo chamado. Aqui está como fazer isso:

saída padrão

saída de erro

Assumindo que o processo vsinstr.exe grava esse erro no stream de erro padrão, você pode obter a mensagem de erro capturando o stream de erro padrão do processo. Para fazer isso, você precisará definir a propriedade RedirectStandardError da class ProcessStartInfo como true, adicionar um manipulador de events ao evento ErrorDataReceived da class Process e chamar o método BeginErrorReadLine da class Process antes de iniciar o processo vsinstr.exe.

Aqui está um código de amostra:

 using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Threading; class CaptureProcessOutput { private ManualResetEvent m_processExited = new ManualResetEvent(false); private List m_errorMessages = new List(); private List m_regularMessages = new List(); private Process m_process = new Process(); public CaptureProcessOutput() { } public void Run (string[] args) { StringBuilder sb = new StringBuilder("/COVERAGE "); sb.Append("hello.exe"); m_process.StartInfo.FileName = "vsinstr.exe"; m_process.StartInfo.Arguments = sb.ToString(); m_process.StartInfo.UseShellExecute = false; m_process.Exited += this.ProcessExited; m_process.StartInfo.RedirectStandardError = true; m_process.StartInfo.RedirectStandardOutput = true; m_process.ErrorDataReceived += this.ErrorDataHandler; m_process.OutputDataReceived += this.OutputDataHandler; m_process.BeginErrorReadLine(); m_process.BeginOutputReadLine(); m_process.Start(); m_processExited.WaitOne(); } private void ErrorDataHandler(object sender, DataReceivedEventArgs args) { string message = args.Data; if (message.StartsWith("Error")) { // The vsinstr.exe process reported an error m_errorMessages.Add(message); } } private void OutputDataHandler(object sender, DataReceivedEventArgs args) { string message = args.Data; m_regularMessages.Add(message); } private void ProcessExited(object sender, EventArgs args) { // This is where you can add some code to be // executed before this program exits. m_processExited.Set(); } public static void Main (string[] args) { CaptureProcessOutput cpo = new CaptureProcessOutput(); cpo.Run(args); } } 

Er – dentro de um bloco try / catch? Estou esquecendo de algo?

 try { Process p = new Process(); StringBuilder sb = new StringBuilder("/COVERAGE "); sb.Append("hello.exe"); p.StartInfo.FileName = "vsinstr.exe"; p.StartInfo.Arguments = sb.ToString(); p.Start(); p.WaitForExit(); } catch(Exception ex) { // Handle exception } 

… tenha em mente que a ex.Message pode não conter a exceção que você especificou acima, enquanto a exceção interna, por exemplo, ex.InnerException pode.

Eu estou supondo que você está vendo esta mensagem durante a debugging. Deixe-me saber se isso não era exatamente o que você estava procurando, mas você poderia usar um bloco try catch simples.

 try { //CODE GOES HERE } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); }