2016-10-19 14 views
-1

wpfでコンソールを開きたいが、プログラムを閉じずにコンソールを2回開こうとしたが、2回目にプログラムがクラッシュした本当に知っているなぜ、私はあなたが新しいコンソールを割り当て、その新しいコンソール用ReadLine()を使用して保持する場合もConsoleクラスの入力ストリームを再割り当てする必要があるように見えますwpfで2回開こうとするとコンソールがクラッシュする

using System; 
using System.Windows; 
using System.Runtime.InteropServices; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     [DllImport("Kernel32")] 
     public static extern void AllocConsole(); 

     [DllImport("Kernel32")] 
     public static extern void FreeConsole(); 

     private void button_Click(object sender, RoutedEventArgs e) 
     { 
       AllocConsole(); 
       string x = Console.ReadLine(); 
       FreeConsole(); 
     } 
    } 
} 
+2

_ "プログラムがクラッシュしました" _ - 具体的にしてください。どのようにプログラムは "クラッシュ"しましたか?それはちょうど応答を停止しましたか?それは例外をスローしましたか?それはただ消えましたか?任意のエラーメッセージがどこにありますか?もしそうなら、彼らは何を言ったのですか?例外があった場合、スタックトレースは何ですか?あなたの質問を改善してください。 –

+0

投稿したコードを試しましたが、私は3つの異なる動作をします。時にはコンソールとプログラム全体がハングすることがあります。 'ReadLine()'呼び出しで例外をスローすることがあります: 'ハンドルが無効です'。あなたがやっていることがそれ自体が間違っている理由を説明するには、コンソールAPIについて十分に分かっていませんが、コンソールAPIを使用する方法ではないことは明らかです。さらに、それがうまくいっても、これは間違ったことです。あなたにはGUIプログラムがあります。コンソールを表示する場合は、独自のウィンドウを表示し、その目的のために使用します。 –

答えて

0

を手助けをしてみたい:

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    AllocConsole(); 

    using (Stream stream = Console.OpenStandardInput()) 
    using (TextReader reader = new StreamReader(stream)) 
    { 
     string x = reader.ReadLine(); 
    } 

    FreeConsole(); 
} 

あなたは本当に間違っていると思いますこの方向で。コンソールウィンドウは、ユーザーと対話するための非常に限定された手段です。そのため、私たちは最初にGUIプログラム(Winforms、WPFなど)を持っています。非常に難しいことはありませんが、確かにの方法は、管理されているプログラムで管理されていない呼び出しが混在していることに慣れていないエラーを実行することよりも難易度は低いです。 IMHO、それは本当に正しい方法です。

関連する問題