Я использую Visual Studio 2012, а также хотел перенаправить stdout и stderr при отладке скрипта, программы на C ++ или MSTest DLL без необходимости изменения самого исходного кода,Мой подход, который я наконец-то придумал, состоял в том, чтобы захватить вывод, используя своего рода промежуточную программу.
Создание консольного приложения C # Windows
Возьмите следующий код C # и создайте / скомпилируйте консольное приложение Windows C # .NET:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
namespace OutputDebugStringConsole
{
class OutputDebugStringConsole
{
private static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (null != outLine.Data)
{
Trace.WriteLine(outLine.Data);
Trace.Flush();
Console.WriteLine(outLine.Data);
}
}
static void Main(string[] args)
{
if (args.Length == 0)
{
return;
}
try
{
Process p = new Process();
p.StartInfo.FileName = args[0];
p.StartInfo.Arguments = String.Join(" ", args, 1, args.Length - 1);
Trace.WriteLine("Calling " + p.StartInfo.FileName + " " + p.StartInfo.Arguments);
p.StartInfo.WorkingDirectory = Directory.GetCurrentDirectory();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
p.ErrorDataReceived += new DataReceivedEventHandler(OutputHandler);
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
// Call WaitForExit() AFTER I know the process has already exited by a successful return from WaitForExit(timeout).
// This causes the code that reads all remaining pending async data to be executed.
// see https://groups.google.com/d/msg/microsoft.public.dotnet.framework.sdk/jEen9Hin9hY/FQtEhjdKLmoJ
Thread.Sleep(100);
p.WaitForExit();
p.Close();
}
catch (Exception e)
{
Trace.WriteLine(e.ToString());
Console.WriteLine("{0} Exception caught.", e);
}
}
}
}
Я использовал Trace.WriteLine ()вместо Debug.WriteLine (), потому что тогда он работает и в версии выпуска вышеуказанного кода.
Использование приложения в отладке проекта VS
ПРИМЕЧАНИЕ: Если у вас естьвыбрал .NET 4 / 4.5 и вы захватываете вывод неуправляемого кода, вам нужно выбрать Mixed в качестве типа отладки / отладчика в настройках проекта.В противном случае (при Авто ) вы можете получить необработанное исключение KernelBase.dll .
Теперь вы можете использовать приложение, поместив вновь созданный
OutputDebugStringConsole.exe
в свойства отладки / команды и
"$ (TargetPath)" [ARGS ...]
или, например, если это MSTest DLL
"$ (DevEnvDir) CommonExtensions \ Microsoft \ TestWindow\ vstest.console.exe "/ Platform: x86 $ (TargetPath)
в ваши отладки / аргументы приложения, которое вы хотите отлаживать.Кавычки в аргументах команды необходимы для обработки пробелов в пути вашего приложения.
Пожалуйста, используйте это только в качестве примера, для чего может использоваться приложение.Я знаю, что VS 2012 Test Explorer действительно предлагает очень хороший способ запуска MSTest DLL и получения выходных данных в структурированном виде.