C#过程中的标准输入/输出

时间:2013-02-18 10:54:15

标签: c# dll process stdout stdin

我的应用App正在使用我的其他应用SubApp。 当App需要SubApp时,它会使用SubApp创建流程,将数据放入SubApp stdin并从SubApp stdout读取。

问题是SubApp正在使用某些库,有时会写入stdout

SubApp代码的片段:

OutsideLibrary.DoSomeInitialization();  // <-- this sometimes writes to stdout
Stream input = Console.OpenStandardInput();
Stream output = Console.OpenStandardOutput();
data = (dataFormat)formatter.Deserialize(input);
//do some job
formatter.Serialize(output, result);

有没有办法阻止我写入stdout时没有的代码?

2 个答案:

答案 0 :(得分:2)

假设您要禁用第三方组件输出并且您可以控制其余的SubApp代码,您可以执行以下操作:在应用程序引导时将标准输出重定向为null。当您需要将某些内容写入stdout临时设置标准输出恢复正常时,再次写入并设置为null。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace stdio
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetOut(System.IO.TextWriter.Null);
            Console.WriteLine("This will go to > null");
            WriteOutput("This is written to standard output");
            Console.WriteLine("This will also go to > null");
            Console.ReadKey();
        }

        static void WriteOutput(String someString)
        {
            Console.SetOut(Console.Out);
            Stream output = Console.OpenStandardOutput();
            StreamWriter sw = new StreamWriter(output);
            sw.Write(someString);
            sw.Flush();
            sw.Close();
            output.Close();
            Console.SetOut(System.IO.TextWriter.Null);
        }



    }
}

答案 1 :(得分:1)

我试过这个:

StreamWriter sw = new StreamWriter(@"c:\nul");
Console.SetOut(sw);
Console.WriteLine("hello!");

但它在新的StreamWriter()中引发异常。

以下可能有效(在外部模块激活之前调用它):

StreamWriter sw = new StreamWriter(Stream.Null);
Console.SetOut(sw);

解决方法是打开一个真实的文本文件并将其删除。