1

我的应用程序App正在使用我的其他应用程序SubAppApp需要时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);

有什么办法可以防止我没有的代码写入标准输出?

4

2 回答 2

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



    }
}
于 2013-02-18T11:38:19.633 回答
1

我试过这个:

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

但它会在 new StreamWriter() 中引发异常。

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

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

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

于 2013-02-18T11:37:45.280 回答