VisualStudioCode で ReadKey, ReadLine を使えるようにする

Console.ReadKey が使えない

 よくC#のサンプルなんかで実行結果表示後にすぐ閉じないように Console.ReadKey を置いたりしている。
VSCode でそのまま書いてデバッグモードで動かすと例外が出るので、どうにかならないかと調べてみた。

例外の再現

準備

 VSCode を立ち上げて適当なフォルダ( ReadTest フォルダ)を作り選択。
VSCode のコンソールで

dotnet new console

と入力してコンソールアプリケーションの基本を作る。


 使うサンプルコードはこんな感じ

using System;

namespace ReadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Push any key.");

            Console.ReadKey();
        }
    }
}

 Push any key と表示した後にキー入力待ちをする、よくあるやつ。

デバッグ実行

 F5 でデバッグを開始するとすぐに Console.ReadKey で例外が発生する。

例外が発生しました: CLR/System.InvalidOperationException
型 'System.InvalidOperationException' のハンドルされていない例外が System.Console.dll で発生しました: 'Cannot read keys when either application does not have a console or when console input has been redirected. Try Console.Read.'

解決方法

 .vscode フォルダ内に launch.json というファイルがあるので開く。
console の項目が internalConsole になっているのでexternalTerminal、もしくは integratedTerminal に変える。


 externalTerminal の場合はコンソール画面が開いて入力待ちになる。
integratedTerminal の場合は VSCode 内のターミナルウィンドウで入力待ちになっている。

なんで?

 launch.json 内の console が internalConsole になってる場合、次のような説明が表示される。

Where to launch the debug target.

internalConsole: Output to the VS Code Debug Console. This doesn't support reading console input (ex:Console.ReadLine)

 デバッグコンソールへの出力のみで、入力をサポートしてないらしい。