7

最近、自分のアプリケーションで次の問題に遭遇しましたAllocConsoleAllocConsoleが呼び出される前にコンソールに書き込もうとした(コードに深く隠されている)ことが原因であることがすぐにわかりました。したがって、次のようになりました。

Console.WriteLine("Foo"); // no console allocated yet
AllocConsole();           // console window appears
Console.WriteLine("Bar"); // expecting "Bar" in the console, but the console is blank

だから私の質問は:なぜこれが起こるのですか?例外はありません(例外はあると思いますが)。

4

3 に答える 3

12

を初めて使用するConsole.WriteLineと、Consoleクラスによって が作成TextWriterされ、プロパティに関連付けられConsole.Outます。これを行う方法は、Win32 を使用して、標準出力ファイルハンドルに関連付けられた低レベル ファイル ハンドルを開くことです。標準出力ハンドルが無効な場合は、すべての出力を破棄する にConsole.Out設定されます。TextWriter.Null

Win32AllocConsole関数は、標準出力ハンドルを作成および設定するため、それを呼び出した後、標準出力ハンドルは異なるか、有効になります。どちらの場合も、古い標準出力を使用するか、すべての出力を破棄するConsole.Outように既に設定されています。

Console.Outを呼び出した後にを強制的に再度開くには、次のAllocConsoleメソッドを使用できます。

于 2011-09-24T06:00:16.390 に答える
1

おそらくConsole、最初に を呼び出したときに、クラスの静的コンストラクターが出力ストリームをセットアップするためですConsole.WriteLine。コンソールが接続されていないため、標準出力ハンドルがないため、出力はビット バケットにルーティングされます。AllocConsole後で呼び出すConsoleと、コンソールが存在することはクラス内に通知されません。Console.Out新しく作成された標準出力ハンドルにアタッチする機会がありません。

于 2011-09-24T05:51:14.340 に答える
0

プロセスは 1 つのみに関連付けることができるconsoleためAllocConsole function、呼び出しプロセスに既にconsole. そして、consoleアプリケーションにはすでにconsole. 詳細はこちら

于 2011-09-24T05:51:47.600 に答える