c# .net process system.diagnostics

c# - ¿Cómo mantiene los colores de la salida de msbuild?



.net process (3)

No sé cómo se puede hacer esto específicamente para msbuild con todas las advertencias / errores / otras cosas que tienen diferentes colores, pero se puede cambiar el color de la consola usando Console.ForegroundColor = ConsoleColor.Red; antes de escribir en él y restablecerlo con Console.ResetColor();

Entonces, cambiaría la suscripción ErrorDataRecibved para cambiar el color a rojo antes de escribir y restablecer el color después de escribir la salida.

Cuando ejecuto msbuild en la línea de comandos, muestra bonitos colores en la consola.

Sin embargo, cuando lo ejecuto desde C # con Process.Start , la salida aparece en blanco y negro. ¿Cómo puedo mantener los colores?

var info = new ProcessStartInfo("msbuild") { UseShellExecute = false, CreateNoWindow = true, RedirectStandardError = true, RedirectStandardOutput = true, }; using (var p = Process.Start(info) ) { p.ErrorDataReceived += (s, e) => Console.Error.WriteLine(e.Data); p.OutputDataReceived += (s, e) => Console.WriteLine(e.Data); p.BeginErrorReadLine(); p.BeginOutputReadLine(); p.WaitForExit(); }

Además, mientras estamos aquí, ¿importa que ejecute Process.Start antes de BeginOutputReadLine ? ¿Se perderá alguna salida?

Motivación, para aquellos interesados. Un proyecto en el que trabajo utiliza una herramienta de compilación personalizada (reinventando la rueda imho). Utiliza msbuild pero detrás de capas intrincadas de direccionamiento indirecto (modelo simplificado arriba). Los colores útiles de Msbuild se pierden. Me gustaría salvarlos.


p.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);

Process.OutputDataReceived lee texto, no colores. La función de redirección de salida que se encuentra debajo de este solo redirecciona el texto estándar, no los atributos de color de la consola. Obtienes exactamente lo mismo cuando ejecutas msbuild con el operador > redirigir desde la línea de comando para enviar su salida a un archivo de texto. Por supuesto, verá texto insulso cuando abra el archivo de texto en el Bloc de notas.

Analizar el resultado redirigido para volver a colorear su propia salida es drásticamente poco práctico. Estás atrapado con sosa. Por otra parte, los programadores no se quejan a menudo de la apariencia de la ventana Lista de errores en el IDE :)


Eso es, no hay otra manera de hacerlo. Su código primero comienza el proceso y luego agrega el manejador de eventos. Entonces, tal vez haya algunos datos que se pierden, pero eso depende de qué tan rápido la CPU procesa el código. Debería agregar mejor el manejador de eventos primero y luego comenzar el proceso. (vea abajo)

using (var p = new Process()) { p.StartInfo = new ProcessStartInfo("msbuild") { UseShellExecute = false, CreateNoWindow = true, RedirectStandardError = true, RedirectStandardOutput = true, }; p.ErrorDataReceived += (s, e) => ErrorLine(e.Data); p.OutputDataReceived += (s, e) => OutputLine(e.Data); p.BeginErrorReadLine(); p.BeginOutputReadLine(); p.Start(); p.WaitForExit(); } void ErrorLine(string text) { Console.ForegroundColor = ConsoleColor.White; Console.BackgroundColor = ConsoleColor.DarkRed; Console.Error.WriteLine(text); Console.ResetColor(); } void OutputLine(string text) { Console.Error.WriteLine(text); }