【问题标题】:Standard input/output in C# processC# 进程中的标准输入/输出
【发布时间】:2013-02-02 18:47:43
【问题描述】:

我的应用程序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);

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

【问题讨论】:

    标签: c# dll process stdout stdin


    【解决方案1】:

    假设您想禁用第三方组件输出并且您可以控制其余的 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);
            }
    
    
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      我试过了:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-12
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        • 2013-09-18
        相关资源
        最近更新 更多