2013-04-19 11 views
5

Wenn ich diesen C# -Code in eine EXE-Datei kompiliere und in einer Windows-Befehlsshell ablaufe, läuft es einwandfrei: Ausgabe der Eingabeaufforderung, Warten auf die selbe Zeile für einige Benutzereingaben, gefolgt von enter. In einer PowerShell v3-Shell läuft es auch gut. Wenn ich jedoch dieselbe EXE-Datei in PowerShell ISE V3 ausführe, gibt es keine Ausgabe von Write ab und hängt an der ReadLine. (Nebenbei wird es Ausgabe von Write emittieren, wenn sie später von einem WriteLine folgt.)Warum hängt PowerShell ISE an diesem C# -Programm?

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Console.Write("invisible prompt: "); 
      var s = System.Console.ReadLine(); 
      System.Console.WriteLine("echo " + s); 
     } 
    } 
} 

Ist das ein ISE Fehler oder gibt es eine Eigenschaft einstellen, damit es funktioniert ...?

+0

Nicht sicher, ob es relevant ist, aber in Powershell heißt es manchmal * Keyboard Polling *, das bestimmte Probleme implementieren kann. Wenn also 'Console.ReadLine()' aufgrund von Powershell aufgerufen wird, verursacht das möglicherweise einen Konflikt. – Greg

Antwort

4

Die ISE unterstützt die Klasse console nicht.

  • Keine Unterstützung für [Konsole] Klasse, versuchen Sie [Konsole] :: = Background 'weiß'.
    • Im Allgemeinen sollten Skripte die der Host-API verwenden (write-host, anstelle der [Konsole] Klasse, so dass sie die Konsole in beide arbeiten, ISE, Remoting- und andere Muscheln.

Referenz: http://blogs.msdn.com/b/powershell/archive/2009/04/17/differences-between-the-ise-and-powershell-console.aspx

+0

Andy: Sie haben mir klar gemacht, dass die Frage, die ich hätte stellen sollen, von der Antwort abhängt: Wenn es einen Workaround/Einstellung/etc. dann wäre diese Frage gut, aber da Sie darauf hinweisen, dass es _nicht_ gibt, sollte die bessere Frage etwas wie sein: _ist es eine Art, Eingaben in C# von ISE zu lesen, ohne die Konsole zu benutzen? _ Aber ich wusste das nicht a priori. Wie auch immer, Sie haben es so beantwortet, dass Sie das Häkchen bekommen - Danke! –

+0

Das wäre eine gute Frage @msorens, sollten Sie es fragen. –

0

Powershell-Lese-Host von der Konsole lesen Sie könnten die Lese-Host aus C# ausführen ausführen von PS-Befehle von C# auf MSDN in den Abschnitten über Pow dokumentiert.. ershell Hosting. Im Folgenden werden die Methodenaufrufe mit einem Powershell-Skript veranschaulicht - es sollte einfach in C# konvertiert werden können. Beachten Sie, dass $ Host an das C# -Programm übergeben werden muss. Daher würden Sie den C# -Programm als Baugruppe innerhalb ISE laden müssen, und riefen Main() wie: [myclass] :: Main ($ host) (im Vergleich zu dem EXE als eigenständiges Programm aufgerufen wird)

[powershell]::create().AddScript('param($ho) $ho.ui.readline()').AddArgument($host).Invoke() 
4

Wie ein Workaround, in Powershell ise, anstatt .\ConsoleApplication1.exe Aufruf start .\ConsoleApplication1.exe aufrufen Dies wird die Anwendung in einer neuen Eingabeaufforderung, die Eingabe von Stdin akzeptiert wird.

+0

+1 Das ist ein praktischer Workaround - danke, dass du es vorgeschlagen hast! –