2009-09-11 41 views
12

Tôi cần gọi thư viện của bên thứ ba xảy ra để phát tán một loạt nội dung trên bảng điều khiển. Mã đơn giản như thế này ...Ngăn chặn đầu ra của bàn điều khiển thư viện của bên thứ ba?

int MyMethod(int a) 
{ 
    int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output 
    return b; 
} 

Có cách nào dễ dàng để ngăn chặn đầu ra bàn điều khiển không mong muốn từ ThirdPartyLibrary không? Vì lý do hiệu suất, các quy trình hoặc luồng mới không thể được sử dụng trong giải pháp.

Trả lời

12

Vâng, bạn có thể sử dụng Console.SetOut đến một thực hiện TextWriter mà không ghi bất cứ nơi nào:

Console.SetOut(TextWriter.Null); 

Điều đó sẽ ngăn chặn tất cả console đầu ra mặc dù. Bạn luôn có thể duy trì tham chiếu đến nhà văn gốc gốcConsole.Out và sử dụng nó cho đầu ra của riêng bạn.

+0

Tính năng này hoạt động trong hầu hết các trường hợp. Tuy nhiên, trong trường hợp của tôi thì không. Thư viện bên ngoài tạo đối tượng COM và ít nhất 1 luồng khác - thậm chí có thể là một tiến trình khác để làm phức tạp vấn đề của tôi. – noctonura

+1

Ah. Thật tuyệt khi biết rằng ban đầu ... nếu nó tạo ra các quy trình khác hoặc viết bảng điều khiển theo những cách khác ngoài việc sử dụng 'Console.WriteLine' vv, điều đó làm cho mọi việc khó khăn hơn nhiều ... –

+0

Có - xin lỗi, Tôi đã không nhận ra điều đó là quan trọng cho đến khi thử đề xuất của bạn. – noctonura

0

Dưới đây là một cách để làm điều đó (mà cũng thường bao gồm quản lý C++ ứng dụng mà bạn P/Gọi từ C# hay cách khác):

internal class OutputSink : IDisposable 
{ 
    [DllImport("kernel32.dll")] 
    public static extern IntPtr GetStdHandle(int nStdHandle); 

    [DllImport("kernel32.dll")] 
    public static extern int SetStdHandle(int nStdHandle, IntPtr hHandle); 

    private readonly TextWriter _oldOut; 
    private readonly TextWriter _oldError; 
    private readonly IntPtr _oldOutHandle; 
    private readonly IntPtr _oldErrorHandle; 

    public OutputSink() 
    { 
     _oldOutHandle = GetStdHandle(-11); 
     _oldErrorHandle = GetStdHandle(-12); 
     _oldOut = Console.Out; 
     _oldError = Console.Error; 
     Console.SetOut(TextWriter.Null); 
     Console.SetError(TextWriter.Null); 
     SetStdHandle(-11, IntPtr.Zero); 
     SetStdHandle(-12, IntPtr.Zero); 
    } 

    public void Dispose() 
    { 
     SetStdHandle(-11, _oldOutHandle); 
     SetStdHandle(-12, _oldErrorHandle); 
     Console.SetOut(_oldOut); 
     Console.SetError(_oldError); 
    } 
} 

Lớp này có thể được gọi như sau:

using (new OutputSink()) 
{ 
    /* Call 3rd party library here... */ 
} 

Điều này sẽ có tác động. Bất kỳ logic ứng dụng nào cố gắng sử dụng bảng điều khiển từ một chuỗi khác trong thời gian bạn đang using các OutputSink sẽ không hoạt động chính xác để ghi vào đầu ra tiêu chuẩn, lỗi chuẩn, đầu ra bảng điều khiển hoặc lỗi bảng điều khiển.

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