2012-08-11 20 views
9

Tôi có một dll bên ngoài được viết bằng C# và tôi đã nghiên cứu từ tài liệu hội đồng mà nó ghi thông báo gỡ lỗi của nó lên Bàn điều khiển bằng cách sử dụng Console.WriteLine.Chuyển hướng bảng điều khiển.writeline từ cửa sổ ứng dụng sang một chuỗi

DLL này ghi vào bàn điều khiển trong tương tác của tôi với giao diện người dùng của ứng dụng, vì vậy tôi không thực hiện cuộc gọi DLL trực tiếp, nhưng tôi sẽ nắm bắt tất cả đầu ra bàn điều khiển, vì vậy tôi nghĩ rằng tôi đã intialize trong tải biểu mẫu, sau đó nhận được đã chụp lại văn bản sau.

Tôi muốn chuyển hướng tất cả đầu ra sang biến chuỗi.

Tôi đã thử Console.SetOut, nhưng việc sử dụng nó để chuyển hướng đến chuỗi không phải là dễ dàng.

+0

đang gì bạn đã sử dụng khi cố gắng gõ 'phương pháp SetOut'? –

Trả lời

18

Như nó có vẻ như bạn muốn bắt đầu ra điều khiển trong thời gian thực, tôi đã tìm ra rằng bạn có thể tạo TextWriter thực hiện của riêng bạn kích hoạt sự kiện bất cứ khi nào một Write hoặc WriteLine xảy ra trên Console.

Nhà văn trông như thế này:

public class ConsoleWriterEventArgs : EventArgs 
    { 
     public string Value { get; private set; } 
     public ConsoleWriterEventArgs(string value) 
     { 
      Value = value; 
     } 
    } 

    public class ConsoleWriter : TextWriter 
    { 
     public override Encoding Encoding { get { return Encoding.UTF8; } } 

     public override void Write(string value) 
     { 
      if (WriteEvent != null) WriteEvent(this, new ConsoleWriterEventArgs(value)); 
      base.Write(value); 
     } 

     public override void WriteLine(string value) 
     { 
      if (WriteLineEvent != null) WriteLineEvent(this, new ConsoleWriterEventArgs(value)); 
      base.WriteLine(value); 
     } 

     public event EventHandler<ConsoleWriterEventArgs> WriteEvent; 
     public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent; 
    } 

Nếu đó là một ứng dụng WinForm, bạn có thể thiết lập các nhà văn và tiêu thụ các sự kiện của nó trong Program.cs như thế này:

/// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     using (var consoleWriter = new ConsoleWriter()) 
     { 
      consoleWriter.WriteEvent += consoleWriter_WriteEvent; 
      consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent; 

      Console.SetOut(consoleWriter); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 

    static void consoleWriter_WriteLineEvent(object sender, Program.ConsoleWriterEventArgs e) 
    { 
     MessageBox.Show(e.Value, "WriteLine"); 
    } 

    static void consoleWriter_WriteEvent(object sender, Program.ConsoleWriterEventArgs e) 
    { 
     MessageBox.Show(e.Value, "Write"); 
    } 
+0

DLL này ghi vào giao diện điều khiển trong tương tác của tôi với UI của ứng dụng, vì vậy tôi không thực hiện cuộc gọi DLL trực tiếp, nhưng tôi sẽ nắm bắt tất cả đầu ra bàn điều khiển, vì vậy tôi nghĩ rằng tôi đã intialize trong tải hình thức, sau đó nhận được rằng một lát sau. – geogeek

+0

Đây có phải là ứng dụng WinForms không? Khi trong dòng chương trình bạn cần đầu ra? –

+0

có nó là một ứng dụng winform C#, tôi cần phải nắm bắt đầu ra console sau một sự kiện GUI. – geogeek

17

Nó thường liên quan đến những điều sau đây:

var originalConsoleOut = Console.Out; // preserve the original stream 
using(var writer = new StringWriter()) 
{ 
    Console.SetOut(writer); 

    Console.WriteLine("some stuff"); // or make your DLL calls :) 

    writer.Flush(); // when you're done, make sure everything is written out 

    var myString = writer.GetStringBuilder().ToString(); 
} 

Console.SetOut(originalConsoleOut); // restore Console.Out 

Vì vậy, trong trường hợp của bạn, bạn muốn thiết lập này trước khi thực hiện cuộc gọi đến DLL của bên thứ ba.

+0

DLL này ghi vào giao diện điều khiển trong tương tác của tôi với UI của ứng dụng, vì vậy tôi không thực hiện cuộc gọi DLL trực tiếp, nhưng tôi sẽ nắm bắt tất cả đầu ra bàn điều khiển, vì vậy tôi nghĩ rằng tôi đã intialize trong tải hình thức, sau đó nhận được rằng một lát sau. – geogeek

1

Hoặc bạn có thể quấn nó lên trong một phương thức trợ giúp lấy một số mã làm đối số chạy nó và trả về chuỗi đã được in. Lưu ý cách chúng tôi xử lý ngoại lệ một cách duyên dáng.

public string RunCodeReturnConsoleOut(Action code) 
{ 
    string result; 
    var originalConsoleOut = Console.Out; 
    try 
    { 
    using (var writer = new StringWriter()) 
    { 
     Console.SetOut(writer); 
     code(); 
     writer.Flush(); 
     result = writer.GetStringBuilder().ToString(); 
    } 
    return result; 
    } 
    finally 
    { 
    Console.SetOut(originalConsoleOut); 
    } 
} 
0

Bạn cũng có thể gọi SetOut với Console.OpenStandardOutput, điều này sẽ khôi phục lại dòng sản lượng ban đầu:

Console.SetOut(new StreamWriter(Console.OpenStandardOutput())); 
Các vấn đề liên quan