2009-10-16 55 views
12

我已经使用ServiceBase帮助程序在C#中编写了Windows服务。在执行过程中,会调用外部本地DLL上的某些过程。令人烦恼的是,这些过程以不受控制的方式写入stdout和/或stderr,因为没有为此DLL提供源。在C#Windows服务上重定向stdout + stderr

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

+0

它是否将DLL作为进程启动?或者简单地引用该DLL? – 2009-10-16 16:40:55

+0

您无法将DLL作为进程启动。这是一个常见问题。 – 2009-10-16 16:42:47

回答

22

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

谢谢。我会这样做的。 – Herchu 2009-10-19 08:10:21

+1

我改变了行 handle = filestream.Handler;由 handle = filestream.SafeFileHandle.DangerousGetHandle(); ,因为filestream.Handler已弃用。 – Herchu 2009-10-19 15:36:29

+1

没有FileStream的任何方式使用它? (即MemoryStream或类似的)? – Steve 2011-12-18 21:27:55

0

退房的Console.SetOut方法。

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

+1

尽管如此,这取决于如何编写DLL,但不会将DLL输出重定向到控制台。通常,它可以工作,但并非总是如此。 – 2009-10-16 16:44:37

+1

里德,那它依赖什么? – Stiefel 2010-07-19 11:13:29

相关问题