2017-01-15 3 views
0

これは、最近のバージョンのVisual Studio IDEのよく知られた問題だと思います。 "> project.txt"のような "Project Properties"ページの "Start Options"の "Command line arguments"ボックスにリダイレクトコマンドを入れようとすると、問題が発生します。C#アプリケーションのコンソールI/Oのリダイレクト

"Visual Studioホスティングプロセスを有効にする"チェックボックスをオフにすることで回避策を得ることができますが、 "デバッグなし"(control-F5)プログラムを起動するとリダイレクトは機能せず、 "> output.txt"プログラムの引数として返されます。

問題は次のとおりです。どのようにリダイレクトをすべての設定で動作させることができますか?

私はいくつかのオプションを見つけました。私は、短時間で汚れた解決策、つまりデバッグには効果があり、リリースではnopを行うことを意味しました。私はそれをあなたと共有したいと思います。

答えて

0

私が提案しているのは、Programクラス(Mainメソッドを持つクラス)に静的コンストラクターを作成し、そこでリダイレクトを行うことです。このようにして、迅速に有効化または無効化することができます。

Environment.CommandLineを使用してプログラムの引数を解析し、 "<"または ">"で始まる引数を探して解決する可能性がありますが、もっと簡単な方が好きです。

次の簡単なプログラムではこのアプローチを使用しています。

using System; 

namespace RedirectConsoleSample 
{ 
    class Program 
    { 
#if DEBUG 
     static Program() 
     { 
      System.IO.TextReader oldConsoleTextReader = Console.In; 
      System.IO.TextWriter oldConsoleTextWriter = Console.Out; 
      System.IO.TextReader newConsoleTextReader = null; 
      System.IO.TextWriter newConsoleTextWriter = null; 

      AppDomain.CurrentDomain.ProcessExit += delegate (object sender, EventArgs e) 
      { 
       try 
       { 
        Console.Out.Flush(); 
        Console.SetOut(oldConsoleTextWriter); 
        Console.SetIn(oldConsoleTextReader); 

        if (newConsoleTextWriter != null) 
        { 
         newConsoleTextWriter.Close(); 
         newConsoleTextWriter = null; 
        } 

        if (newConsoleTextReader != null) 
        { 
         newConsoleTextReader.Close(); 
         newConsoleTextReader = null; 
        } 
       } 
       catch (Exception ex) 
       { 
        System.Diagnostics.Trace.TraceError("ProcessExit: " + ex.Message); 
       } 
      }; 

      newConsoleTextReader = new System.IO.StreamReader("Input.txt", System.Text.Encoding.Default, true); 
      newConsoleTextWriter = new System.IO.StreamWriter("Output.txt", false, System.Text.Encoding.Default); 

      Console.Out.Flush(); 
      Console.SetIn(newConsoleTextReader); 
      Console.SetOut(newConsoleTextWriter); 
     } 
#endif 
     static void Main(string[] args) 
     { 
      for (int i = 0; i < args.Length; i++) 
       Console.Out.WriteLine("argument[{0}] = '{1}'", i, args[i]); 

      for (string line = Console.In.ReadLine(); line != null; line = Console.In.ReadLine()) 
       Console.Out.WriteLine(line); 
     } 
    } 
} 

私は役に立つと思います。

関連する問題