Redirigir stdout + stderr en un servicio de Windows C #

He escrito un servicio de Windows en C # usando el ayudante ServiceBase . Durante su ejecución se llaman algunos procedimientos en una DLL nativa externa. Es molesto que esos procedimientos escriban a stdout y / o stderr de manera incontrolada ya que no se proporcionan fonts para este archivo DLL.

¿Es posible redirigir esos resultados del servicio C # a un archivo de registro?

Puede hacer esto a través de PInvoke a SetStdHandle :

 [DllImport("Kernel32.dll", SetLastError = true) ] public static extern int SetStdHandle(int device, IntPtr handle); // in your service, dispose on shutdown.. FileStream filestream; StreamWriter streamwriter; void Redirect() { int status; IntPtr handle; filestream = new FileStream("logfile.txt", FileMode.Create); streamwriter = new StreamWriter(filestream); streamwriter.AutoFlush = true; Console.SetOut(streamwriter); Console.SetError(streamwriter); handle = filestream.Handle; status = SetStdHandle(-11, handle); // set stdout // Check status as needed status = SetStdHandle(-12, handle); // set stderr // Check status as needed } 

Consulte el método Console.SetOut .

Le permitirá redireccionar la salida de la consola a un TextWriter.