2009-10-16 45 views
12

Tôi đã viết dịch vụ Windows bằng C# bằng cách sử dụng trình trợ giúp ServiceBase. Trong quá trình thực thi, một số thủ tục trên một DLL gốc bên ngoài được gọi. Thật khó chịu, những thủ tục này viết cho stdout và/hoặc stderr một cách không kiểm soát được vì không có nguồn nào được cung cấp cho DLL này.Chuyển hướng stdout + stderr trên dịch vụ C# Windows

Có thể chuyển hướng các đầu ra đó từ dịch vụ C# tới tệp nhật ký không?

+0

là nó bắt đầu lên các DLL như là một quá trình? hoặc chỉ đơn giản là tham khảo DLL? –

+0

Bạn không thể bắt đầu một DLL như là một quá trình. Đây là một vấn đề phổ biến. –

Trả lời

22

Bạn có thể làm điều này thông qua 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

Cảm ơn. Tôi sẽ làm điều này. – Herchu

+1

Tôi đã thay đổi dòng handle = filestream.Handler; bởi handle = filestream.SafeFileHandle.DangerousGetHandle(); vì filestream.Handler không còn được dùng nữa. – Herchu

+1

Bất kỳ cách nào để sử dụng tính năng này mà không có FileStream? (ví dụ: MemoryStream hoặc tương tự)? – Steve

0

Kiểm tra các phương pháp Console.SetOut.

Nó sẽ cho phép bạn chuyển hướng đầu ra của bàn điều khiển sang TextWriter.

+1

Tùy thuộc vào cách DLL được viết, điều đó sẽ không chuyển hướng đầu ra của DLL sang giao diện điều khiển. Thông thường, nó hoạt động, nhưng không phải lúc nào. –

+1

Reed, vậy nó phụ thuộc vào điều gì? – Stiefel

Các vấn đề liên quan