2017-10-24 2 views
0

Ich versuche ReadKey() zu verwenden, um ein Kennwortfeld zu erhalten, so dass es nicht in der Konsole für eine .net Core-App angezeigt wird, die ich auf Ubuntu ausgeführt werde.ReadKey funktioniert nicht in .net-Kern

Dieser Code ist:

 while (true) 

     { 

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

      if (key.Key == ConsoleKey.Enter) 

       break; 

      Io.RootPass += key.KeyChar; 

     } 

Aber ich bekomme diese Ausnahme:

Ausnahme ist aufgetreten: CLR/System.InvalidOperationException Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' aufgetreten im System .Console.dll: 'Schlüssel können nicht gelesen werden, wenn eine Anwendung keine Konsole hat oder wenn die Konsoleneingabe umgeleitet wurde. Versuchen Sie Console.Read. '

ReadLine() funktioniert gut. Warum funktioniert ReadKey() nicht?

Edit:

Eigentlich Console.ReadLine() funktioniert nicht entweder es funktioniert einfach nicht eine Ausnahme werfen. Der Rückgabewert wird nicht zugewiesen, wenn ein Treffer getroffen wird, so dass das Programm klebt.

Ich vermute, das liegt daran, dass Linux-Terminal anders funktioniert. Gibt es eine andere Schnittstelle für Linux-Terminal, die funktioniert?

+0

https://stackoverflow.com/questions/19939666/c-sharp-readkey-crashing-console-app-when-called-using-nul –

+0

@EvanTrimboli mein Code ist der gleiche wie in der Antwort von der, die Sie mich mit – Guerrilla

+0

verbinden Ich denke, Problem ist, weil ich im Ubuntu-Terminal – Guerrilla

Antwort

1

Gefunden meiner Antwort in OmniSharp visuellen Code-Dokumentation: https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window

Konsole (Terminal) Fenster

standardmäßig auf den VS-Code geht Prozesse gestartet werden, mit ihrer Konsolenausgabe (stdout/stderr) Debugger-Konsole. Dies ist nützlich für ausführbare Dateien, die ihre Eingabe aus dem Netzwerk, Dateien, usw. nehmen. Aber das funktioniert nicht für Anwendungen, die von der Konsole lesen möchten (zB: Console.ReadLine). Für diese Anwendungen verwenden eine Einstellung wie die folgenden:

„Konsole“: „integratedTerminal“ Wenn dies auf integratedTerminal gesetzt der Zielprozess innerhalb VS-Code des integrierten Terminal laufen. Klicken Sie auf die Registerkarte "Terminal" in der Registerkarte Gruppe unter dem Editor interagieren mit Ihrer Anwendung.

Wenn dies auf externalTerminal eingestellt ist, wird der Zielprozess in einem separaten Terminal ausgeführt.

Ich habe diese Einstellung beim Start geändert.json und jetzt funktioniert es

0

Etwas, das ich in meinem eigenen Code verwendet habe (was ich soweit nicht in der verknüpften Frage sehe) ist Console.In, die direkt mit der Standardeingabe interagiert.
Ich habe es in meinem eigenen Projekt mit Windows CMD und openSUSE KTerm getestet und es funktioniert wie erwartet.

Mein Code ist speziell:
Console.In.ReadLineAsync().GetAwaiter().GetResult();
weil es in dem IO Umgang mit Background ist die Async läuft.
Ihr kann mit Console.In.ReadKey(); wegkommen, obwohl YMMV, wie ich nichts außer ReadLine getestet habe.

Verwandte Themen