views:

1274

answers:

2

I've wrote a windows service in C# using ServiceBase helper. During its execution some procedures on an external native DLL are called. Annoyingly, those procedures write to stdout and/or stderr in a 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?

Regards

+2  A: 

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
}
Reed Copsey
Thanks. I'll do this.
Herchu
I've changed the line handle = filestream.Handler;by handle = filestream.SafeFileHandle.DangerousGetHandle();because filestream.Handler is deprecated.
Herchu
A: 

Check out the Console.SetOut method.

It will allow you to redirect console output to a TextWriter.

Jay Riggs
Depending on how the DLL is written, that won't redirect the DLLs output to the console, though. Typically, it works, but not always.
Reed Copsey
Reed, so what does it depend on?
Stiefel