在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。