Перенаправление stdout+stderr на службу Windows C#
Я написал службу Windows на C#, используя ServiceBase
помощником. Во время его выполнения вызываются некоторые процедуры на внешней собственной DLL. Досадно, что эти процедуры пишут в stdout и / или stderr неконтролируемым образом, поскольку никакие источники не указаны для этой DLL.
можно ли перенаправить эти выходные данные из службы C# в файл журнала?
2 ответов
вы можете сделать это через 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
}