Search code examples
c#.netwindows-servicesstdoutstderr

Redirect stdout+stderr on a C# Windows service


I've written a Windows service in C# using the ServiceBase helper. During its execution, some procedures in an external native DLL are called. Annoyingly, those procedures write to stdout and/or stderr in an uncontrolled manner as no sources are given for this DLL.

Is it possible to redirect those outputs from the C# service to a log file?


Solution

  • You can do this via PInvoke to 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
    }