2013-04-19 5 views
5

Se compilo questo codice C# in un file EXE ed eseguito in una shell dei comandi di Windows, funziona bene: emettendo il prompt, in attesa sulla stessa linea per qualche input utente seguito da enter, facendo eco a quell'input. Anche nell'esecuzione in una shell PowerShell v3 funziona egregiamente. Se, tuttavia, eseguo questo stesso file EXE in PowerShell ISE V3, non emette mai l'output da Write e si blocca sullo ReadLine. (Per inciso, si emetterà in uscita dal Write se è poi seguita da una WriteLine.)Perché PowerShell ISE si blocca su questo programma C#?

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

questo è un bug ISE o c'è qualche proprietà di regolare per farlo funzionare ...?

+0

Non sono sicuro se sia rilevante, ma in PowerShell talvolta viene chiamato * Polling tastiera * che può implementare determinati problemi. Quindi forse quando viene chiamato 'Console.ReadLine()' a causa di PowerShell che usa quel polling può causare un conflitto. – Greg

risposta

4

L'ISE non supporta la classe console.

  • Nessun supporto per il [Console] classe, provare [console] :: BackgroundColor = 'bianco'.
    • In generale, gli script dovrebbero usare (write-host del API ospite, invece del [Console] classe, in modo che essi lavorano in entrambe le console, ISE, Remoting e altre shell.

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

+0

Andy: Mi hai fatto capire che la domanda che avrei dovuto fare dipende dalla risposta: se c'era una soluzione/impostazione/ecc. allora questa domanda sarebbe buona così com'è, ma dal momento che tu fai notare che non c'è _non_ allora la domanda migliore dovrebbe essere qualcosa di simile: c'è un modo per leggere gli input in C# da ISE senza usare la console? _ Ma non lo sapevo a priori. Ad ogni modo, hai risposto come chiesto in modo da ottenere il segno di spunta - grazie! –

+0

Sarebbe una buona domanda @msorens, dovresti chiederlo. –

0

PowerShell lettura ospite leggerà dalla console è possibile eseguire la lettura-host dall'interno C# l'esecuzione di comandi PS da C# è documentato su MSDN in sezioni circa Pow.. hosting ershell. Quanto segue dimostra le chiamate dei metodi con uno script PowerShell - dovrebbe essere facile da convertire in C#. Si noti che $ host deve essere passato al programma C#. si sarebbe quindi avere per caricare il programma C# come un insieme all'interno di ISE e invocare Main() come: [MyClass] :: principale ($ host) (contro invocando il file EXE come un programma autonomo)

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

Come una soluzione alternativa, in powershell ise, invece di chiamare .\ConsoleApplication1.exe chiamata start .\ConsoleApplication1.exe Ciò avvierà l'applicazione in un nuovo prompt dei comandi, che accetterà input da stdin.

+0

+1 Questo è un trucco pratico - grazie per averlo suggerito! –