Как получить сообщение об ошибке с C # - PullRequest
34 голосов
/ 15 февраля 2011

Для vsinstr -coverage hello.exe я могу использовать код C # следующим образом.

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();

При возникновении ошибки я получаю сообщение об ошибке: Error VSP1018: VSInstr does not support processing binaries that are already instrumented..

Как я могу получить это сообщение об ошибке с C #?

1010 * решаемые * Я могу получить сообщения об ошибках из ответов. 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); } } }

Ответы [ 6 ]

16 голосов
/ 15 февраля 2011

Вам необходимо перенаправить стандартный вывод или стандартную ошибку.Вот пример кода для стандартного вывода:

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();
14 голосов
/ 15 февраля 2011

Вы должны перенаправить StdError и прочитать поток, чтобы перехватить ошибки.

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.
4 голосов
/ 15 февраля 2011

Вы должны получить стандартный / ошибочный вывод вызванного процесса. Вот как это сделать:

стандартный вывод

ошибка вывода

2 голосов
/ 15 февраля 2011

Предполагая, что процесс vsinstr.exe записывает эту ошибку в стандартный поток ошибок, вы можете получить сообщение об ошибке, захватив стандартный поток ошибок процесса. Для этого вам нужно установить для свойства RedirectStandardError класса ProcessStartInfo значение true, добавить обработчик события в событие ErrorDataReceived класса Process и вызвать метод BeginErrorReadLine класса Process до запуска процесса vsinstr.exe.

Вот пример кода:

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<string> m_errorMessages = new List<string>();
    private List<string> m_regularMessages = new List<string>();
    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);
    }
}
0 голосов
/ 15 февраля 2011

Er - внутри блока try / catch?Я что-то упустил?

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
}

... имейте в виду, что ex.Message может не содержать исключение, которое вы указали выше, в то время как внутреннее исключение, например, ex.InnerException может.

0 голосов
/ 15 февраля 2011

Я предполагаю, что вы видите это сообщение во время отладки. Дайте мне знать, если это не совсем то, что вы искали, но вы можете использовать простой блок try catch.

try
{
    //CODE GOES HERE
} catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine(ex.Message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...