【问题标题】:ReadKey not working in .net coreReadKey 在 .net 核心中不起作用
【发布时间】:2018-04-04 16:37:50
【问题描述】:

我正在尝试使用 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.Console.dll 中发生了“System.InvalidOperationException”类型的未处理异常:“当任一应用程序没有控制台或控制台输入已被重定向时,无法读取密钥。试试 Console.Read。'

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

编辑:

实际上 Console.ReadLine() 不起作用,它只是不会引发异常。回车时没有赋值返回值所以程序卡住了。

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

【问题讨论】:

  • @EvanTrimboli 我的代码与您将我链接到的那个人的答案相同
  • 我认为问题是因为我在 Ubuntu 终端中运行
  • 无论如何,我都无法在 Ubuntu 14.04 下使用 .net-core 2.0.2 重现您的错误,但我使用了相同的代码,除了我对读入键所做的操作。

标签: c# .net-core


【解决方案1】:

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

控制台(终端)窗口

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

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

当它设置为 externalTerminal 时,目标进程将在一个 单独的终端。

我在 launch.json 中更改了这个设置,现在它可以工作了

【讨论】:

  • 我没有launch.json文件,这个在哪里?
  • 点击调试设置时由vscode创建。
  • 我刚回去检查我的代码,看看我做了什么,因为这是一年多以前的事了。看起来我重构了应用程序以从命令行参数和设置文件中工作
  • 你能告诉我问题的方法吗?我将不胜感激
【解决方案2】:

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

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

【讨论】:

  • 那么基本上解决方案是什么?
  • 基本上解决方案将是 Console.In.Readkey(); 而不是 System.Console.ReadKey(),因为如果控制台输入被重定向,Console.In 将访问它,而 Console 本身可能无法访问它。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2021-01-30
    • 2021-06-18
    • 2023-03-07
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多