Подтвердить что ты не робот

Как получить сообщение об ошибке с С#

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

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..

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

решаемые

Я могу получить сообщения об ошибках из ответов.

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);
        }
    }
}
4b9b3361

Ответ 1

Вам нужно перенаправить стандартный вывод или стандартную ошибку. Здесь пример кода для 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();

Ответ 2

Вам нужно перенаправить 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

Предполагая, что процесс 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);
    }
}

Ответ 5

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 может.

Ответ 6

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

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