ReadKey无法在.net核心中运行

时间:2017-10-24 02:02:55

标签: c# .net-core

我正在尝试使用ReadKey()获取密码字段,因此它不会在控制台中显示我在Ubuntu上运行的.net核心应用程序。

这是代码:

        while (true)

        {

            var key = System.Console.ReadKey(true);

            if (key.Key == ConsoleKey.Enter)

                break;

            Io.RootPass += key.KeyChar;

        } 

但我得到了这个例外:

  

发生异常:CLR / System.InvalidOperationException   类型为' System.InvalidOperationException'的未处理异常在System.Console.dll中发生:'当任一应用程序没有控制台或重定向控制台输入时,无法读取密钥。试试Console.Read。'

ReadLine()工作正常。为什么ReadKey()不起作用?

编辑:

实际上,Console.ReadLine()不起作用,或者它不会抛出异常。输入命中时不会分配返回值,因此程序会坚持。

我猜这是因为linux终端的工作方式不同。 Linux终端有不同的界面吗?

3 个答案:

答案 0 :(得分:11)

在OmniSharp Visual Code文档中找到我的答案:https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window

  

控制台(终端)窗口

     

默认情况下,将使用其控制台输出启动进程   (stdout / stderr)转到VS Code Debugger Console。这很有用   对于从网络,文件等获取输入的可执行文件   但这对于想要从中读取的应用程序不起作用   console(例如:Console.ReadLine)。对于这些应用程序,请使用设置   如下:

     

“console”:“integratedTerminal”当此设置为integratedTerminal时   目标进程将在VS Code的集成终端内运行。   单击编辑器下方的选项卡组中的“终端”选项卡   与您的应用程序进行交互。

     

当此设置为externalTerminal时,目标进程将在a中运行   单独的终端。

我在launch.json中更改了此设置,现在可以正常工作

答案 1 :(得分:1)

我将我的 webjob 部署到 Azure,并收到了类似的错误。 我通过以下检查解决了这个问题;

if (!Console.IsInputRedirected && Console.KeyAvailable)
                {
                    string read = await Console.In.ReadLineAsync();

                    if (read == "f")
                    { // run your logic ...

答案 2 :(得分:0)

我在自己的代码中使用过的东西(据我所知,在链接的问题中未提及)是Console.In,它与标准输入直接交互。
我已经在我自己的项目中使用Windows CMD和openSUSE KTerm测试了它,它按预期工作。

我的代码具体为:
Console.In.ReadLineAsync().GetAwaiter().GetResult();
因为它在IO处理正在运行Async的BackgroundWorker中 你可以通过Console.In.ReadKey();获得ReadLine,尽管是YMMV,因为除了{{1}}之外我没有测试任何东西。