我使用ServiceBase
帮助程序在 C# 中编写了一个 Windows 服务。在执行期间,会调用外部本地 DLL 中的一些过程。令人讨厌的是,这些程序以不受控制的方式写入 stdout 和/或 stderr,因为没有为此 DLL 提供源。
是否可以将这些输出从 C# 服务重定向到日志文件?
我使用ServiceBase
帮助程序在 C# 中编写了一个 Windows 服务。在执行期间,会调用外部本地 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
}
查看Console.SetOut方法。
它将允许您将控制台输出重定向到 TextWriter。