2009-10-16 14 views
12

C# içinde ServiceBase yardımcısını kullanarak bir Windows servisi yazdım. Çalışması sırasında harici bir yerel DLL üzerinde bazı prosedürler denir. Bu DLL için hiçbir kaynak verilmediğinden, bu prosedürler kontrolsüz bir şekilde stdout ve/veya stderr yazıyor.C# Windows hizmetinde stdout + stderr'yi yönlendirin

Bu çıktıları C# hizmetinden bir günlük dosyasına yeniden yönlendirmek mümkün mü?

+0

DLL bir Süreç olarak başlatılıyor mu? ya da sadece DLL başvuruyor? –

+0

Bir DLL bir işlem olarak başlatamazsınız. Bu yaygın bir sorundur. –

cevap

22

Sen SetStdHandle için PInvoke aracılığıyla yapabilirsiniz:

[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

Teşekkürler. Bunu yapacağım. – Herchu

+1

Satırı değiştirdim handle = filestream.Handler; tarafından handle = filestream.SafeFileHandle.DangerousGetHandle(); çünkü filestream.Handler kullanımdan kaldırılmıştır. – Herchu

+1

Bunu FileStream olmadan kullanmanın herhangi bir yolu var mı? (yani MemoryStream veya benzeri)? – Steve

0

kontrol dışarı Console.SetOut yöntemi.

Konsol çıktısını bir TextWriter'e yönlendirmenize izin verir.

+1

DLL'nin nasıl yazıldığına bağlı olarak, DLL'lerin çıktısını konsola yeniden yönlendirmez. Genellikle çalışır, ancak her zaman değil. –

+1

Reed, peki neye bağlı? – Stiefel