Перенаправление 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
}

Проверьте