我正在尝试使用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终端有不同的界面吗?
答案 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}}之外我没有测试任何东西。