在C#Windows服务上redirectstdout + stderr

我用C#编写了一个使用ServiceBase帮助程序的Windows服务。 在执行过程中,调用外部本地DLL上的某些过程。 令人烦恼的是,这些过程以不受控制的方式写入stdout和/或stderr,因为没有给出这个DLL的源代码。

是否有可能将这些输出从C#服务redirect到日志文件?

你可以通过PInvoke到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 } 

查看Console.SetOut方法。

它将允许您将控制台输出redirect到TextWriter。