我的应用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时没有的代码?
答案 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);
解决方法是打开一个真实的文本文件并将其删除。