我已經使用ServiceBase
幫助程序在C#中編寫了Windows服務。在執行過程中,會調用外部本地DLL上的某些過程。令人煩惱的是,這些過程以不受控制的方式寫入stdout和/或stderr,因爲沒有爲此DLL提供源。在C#Windows服務上重定向stdout + stderr
是否有可能將這些輸出從C#服務重定向到日誌文件?
我已經使用ServiceBase
幫助程序在C#中編寫了Windows服務。在執行過程中,會調用外部本地DLL上的某些過程。令人煩惱的是,這些過程以不受控制的方式寫入stdout和/或stderr,因爲沒有爲此DLL提供源。在C#Windows服務上重定向stdout + stderr
是否有可能將這些輸出從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。
儘管如此,這取決於如何編寫DLL,但不會將DLL輸出重定向到控制檯。通常,它可以工作,但並非總是如此。 – 2009-10-16 16:44:37
裏德,那它依賴什麼? – Stiefel 2010-07-19 11:13:29
它是否將DLL作爲進程啓動?或者簡單地引用該DLL? – 2009-10-16 16:40:55
您無法將DLL作爲進程啓動。這是一個常見問題。 – 2009-10-16 16:42:47