2009-10-16 14 views
12

Napisałem usługę Windows w języku C# za pomocą pomocnika ServiceBase. Podczas jego wykonywania wywoływane są niektóre procedury zewnętrznej zewnętrznej biblioteki DLL. Irytujące, procedury te piszą na stdout i/lub stderr w niekontrolowany sposób, ponieważ nie podano źródeł dla tej biblioteki DLL.Przekierowanie stdout + stderr na usługę C# Windows

Czy można przekierować te wyjścia z usługi C# do pliku dziennika?

+0

jest uruchamianie biblioteki DLL jako procesu? lub po prostu odwołanie do biblioteki DLL? –

+0

Nie można uruchomić biblioteki DLL jako procesu. Jest to częsty problem. –

Odpowiedz

22

Można to zrobić poprzez PInvoke do 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

Dzięki. Zrobię to. – Herchu

+1

Zmieniono linię handle = filestream.Handler; przez handle = filestream.SafeFileHandle.DangerousGetHandle(); ponieważ plik filestream.Handler jest przestarzały. – Herchu

+1

Jakikolwiek sposób użyć tego bez pliku FileStream? (tj. MemoryStream lub podobny)? – Steve

0

Sprawdź metodę Console.SetOut.

Pozwoli to przekierować wyjście konsoli do TextWriter.

+1

W zależności od tego, jak napisana jest biblioteka DLL, to nie przekierowuje danych wyjściowych bibliotek DLL do konsoli. Zazwyczaj działa, ale nie zawsze. –

+1

Reed, więc od czego to zależy? – Stiefel

Powiązane problemy