2015-06-08 16 views
5

già in esecuzione Ecco il mio codice:WriteLine per processo

static void Main(string[] args) 
{ 
    if(args.Length > 1) 
    { 
     int id; 
     if(int.TryParse(args[0], out id)) 
     { 
      try 
      { 
       var p = Process.GetProcessById(id); 
       p.StandardInput.WriteLine(args[1]); 
      } 
      catch (ArgumentException) 
      { 
       Console.WriteLine($"Couldn't find process with id {id}"); 
      } 
     } 
     else 
     { 
      Console.WriteLine($"Couldn't find process with id {args[0]}"); 
     } 
    } 
} 

ho avuto un processo per la sua identificazione. Ha funzionato bene Quindi ho provato a inviare qualcosa al suo stdin. Ciò ha gettato un'eccezione InvalidOperationException. Nota: l'eccezione si è verificata quando ho provato a ottenere StandardInput, non quando ho provato a scrivere su WriteLine.

Credo di sapere perché ho ottenuto l'eccezione. Il processo non è stato avviato dalla mia applicazione, quindi non ho mai avuto la possibilità di impostare RedirectStandardInput su true.

Il mio obiettivo è essere in grado di utilizzare questa app per inviare testo a una console interattiva python (o un'altra lingua). Voglio comunque essere in grado di immettere il testo personalmente al prompt di python, ma voglio anche dare il controllo della mia app.

Come posso fare?

+0

Questo ti aiuta? http://stackoverflow.com/questions/10390829/is-it-possible-to-talk-with-running-process – ragerory

+0

Per quelli confusi: il prefisso '$' è parte di C# 6 (interpolazione stringa). –

+1

@ragerory L'ho visto, ma questo presuppone che tu controlli entrambi i processi. Non ho il controllo su un prompt di Python. Potrei scrivere un processo di avviamento attraverso il quale vorrei iniziare qualsiasi cosa a cui voglio inviare qualcosa, ma è un po 'goffo. – phil

risposta

2

Bene, hai colpito l'unghia sulla testa. A meno che tu non inizi il processo da solo, non possiedi i flussi di comunicazione - e non c'è davvero un modo (ragionevole) per aggirare questo problema.

Se si esegue un'applicazione console per impostazione predefinita, viene eseguita in cmd - ovvero chi possiede i flussi. Se vuoi che la tua applicazione "host" il processo, dovrai essere tu a farla partire. Dovrai semplicemente imparare a chiamare myHoster myApp anziché start myApp :)

Si potrebbe anche prendere in considerazione la codifica di un host PowerShell. Questo ti permetterebbe di gestire facilmente una shell interattiva, anche se dovresti imparare a usare PowerShell invece di CMD :) È abbastanza facile da implementare, PowerShell è davvero abbastanza estendibile.

Problemi correlati