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

标签 c# .net windows-services stdout stderr

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

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

最佳答案

您可以通过 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
}

关于c# - 在 C# Windows 服务上重定向 stdout+stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579074/

相关文章:

c# - 如何让 Windows 服务 self 更新?

c# - 如何通过C#中调用存储过程将URL中的xml数据插入SQL Server 2008数据库

c# - 在许多应用程序之间共享连接字符串

c# - Visual Studio 测试任务 : Test Assembly wildcard format

c# - 如何使用元素序列作为目标正确搜索和解析数组

c# - 如何自动启动窗口服务

c# - Entity Framework 查询中 && 和 where 条件的区别

c# - 将可序列化对象保存到 .net 中的注册表?

c# - 检查表是否包含重叠的时间跨度

c# - 如何从 .NET Core 2.1/2.2 创建 Windows 服务