在C#Windows服务上重定向stdout + stderr

Her*_*chu 14 .net c# windows-services stdout stderr

我使用ServiceBase帮助器在C#中编写了一个Windows服务.在执行期间,会调用外部本机DLL上的一些过程.令人讨厌的是,这些程序以不受控制的方式写入stdout和/或stderr,因为没有为此DLL提供任何来源.

是否可以将这些输出从C#服务重定向到日志文件?

Ree*_*sey 23

你可以通过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
}
Run Code Online (Sandbox Code Playgroud)

  • 我改变了句柄 = filestream.Handler; by handle = filestream.SafeFileHandle.DangerousGetHandle(); 因为 filestream.Handler 已被弃用。 (2认同)