【问题标题】:Redirect stdout+stderr on a C# Windows service在 C# Windows 服务上重定向 stdout+stderr
【发布时间】:2009-10-16 16:31:59
【问题描述】:

我使用 ServiceBase 帮助器在 C# 中编写了一个 Windows 服务。在其执行期间,会调用外部本地 DLL 中的一些过程。令人讨厌的是,这些程序以不受控制的方式写入标准输出和/或标准错误,因为没有为此 DLL 提供源。

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

【问题讨论】:

  • 是否将 DLL 作为进程启动?还是只是引用 DLL?
  • 您不能将 DLL 作为进程启动。这是一个常见问题。

标签: c# .net windows-services stdout stderr


【解决方案1】:

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

【讨论】:

  • 我已经改变了句柄 = filestream.Handler;通过句柄 = filestream.SafeFileHandle.DangerousGetHandle();因为 filestream.Handler 已被弃用。
  • 有什么方法可以在没有 FileStream 的情况下使用它? (即 MemoryStream 或类似的)?
  • @ReedCopsey - 请参阅我对我的新问题的类似评论的回复:stackoverflow.com/questions/8555002/…
  • @Herchu 您确实意识到 DangerousGetHandle 中的“危险”?这是有原因的:msdn.microsoft.com/en-us/library/…
  • @RuiMarques 是的,他们叫我危险是有原因的! :) 现在认真;那是 2009 年。如果我碰巧再次需要它,我会按照史蒂夫的解决方案编写它。
【解决方案2】:

查看Console.SetOut 方法。

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

【讨论】:

  • 根据 DLL 的编写方式,这不会将 DLL 输出重定向到控制台。通常,它会起作用,但并非总是如此。
  • 芦苇,那么它依赖什么?
猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 2014-07-22
  • 2017-09-21
  • 1970-01-01
  • 2022-01-18
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多