18

C#で記述された外部dllがあり、アセンブリのドキュメントから、を使用してデバッグメッセージをコンソールに書き込むことを確認しましたConsole.WriteLine

このDLLは、アプリケーションのUIとの対話中にコンソールに書き込むため、DLL呼び出しを直接行うことはありませんが、すべてのコンソール出力をキャプチャするため、フォームの読み込みで初期化して、後でキャプチャしたテキストを取得する必要があると思います。

すべての出力を文字列変数にリダイレクトしたいと思います。

試しConsole.SetOutましたが、文字列にリダイレクトするための使用は簡単ではありません。

4

5 に答える 5

32

コンソールの出力をリアルタイムで取得したいように思われるので、 でまたはが発生するTextWriterたびにイベントを発生させる独自の実装を作成できることがわかりました。WriteWriteLineConsole

ライターはこんな感じです。

    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;
    }

WinForm アプリの場合は、次のようにライターをセットアップし、そのイベントを Program.cs で使用できます。

    /// <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");
    }
于 2012-08-11T03:46:44.260 に答える
22

基本的に以下の金額になります。

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

したがって、あなたの場合、サードパーティの DLL を呼び出す前にこれを設定します。

于 2012-08-11T03:44:11.863 に答える
4

Console.OpenStandardOutput で SetOut を呼び出すこともできます。これにより、元の出力ストリームが復元されます。

Console.SetOut(new StreamWriter(Console.OpenStandardOutput()));
于 2014-12-10T11:32:18.273 に答える