首页 文章

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

提问于
浏览
12

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

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

2 回答

  • 0

    你可以通过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
    }
    
  • 22

    查看Console.SetOut方法 .

    它将允许您将控制台输出重定向到TextWriter .

相关问题