2009-10-16 37 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

相關問題