2009-10-16 11 views
12

Ho scritto un servizio Windows in C# utilizzando l'helper ServiceBase. Durante la sua esecuzione vengono chiamate alcune procedure su una DLL nativa esterna. Fastidiosamente, tali procedure scrivono su stdout e/o stderr in modo incontrollato poiché non viene fornita alcuna fonte per questa DLL.Reindirizzamento stdout + stderr su un servizio Windows C#

È possibile reindirizzare quelle uscite dal servizio C# a un file di registro?

+0

sta avviando la DLL come processo? o semplicemente facendo riferimento alla DLL? –

+0

Non è possibile avviare una DLL come processo. Questo è un problema comune. –

risposta

22

È possibile farlo attraverso PInvoke a 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

Grazie. Lo farò. – Herchu

+1

Ho cambiato la riga handle = filestream.Handler; di handle = filestream.SafeFileHandle.DangerousGetHandle(); perché filestream.Handler è deprecato. – Herchu

+1

Un modo per usarlo senza un FileStream? (cioè MemoryStream o simile)? – Steve

0

Partenza il metodo Console.SetOut.

Permette di reindirizzare l'output della console a un TextWriter.

+1

A seconda di come viene scritta la DLL, tuttavia, non verrà reindirizzato l'output della DLL alla console. In genere, funziona, ma non sempre. –

+1

Reed, quindi da cosa dipende? – Stiefel

Problemi correlati