Je dois écrire un wrapper pour un programme de ligne de commande interactif. Cela signifie que je dois pouvoir envoyer des commandes à l'autre programme via son entrée standard et recevoir la réponse via sa sortie standard.Comment utiliser un programme de ligne de commande interactif à partir d'un autre programme .NET
Le problème est que le flux de sortie standard semble être bloqué alors que le flux d'entrée est toujours ouvert. Dès que je ferme le flux d'entrée, j'obtiens la réponse. Mais alors je ne peux pas envoyer plus de commandes.
C'est ce que je me sers au moment (la plupart du temps de here):
void Main() {
Process process;
process = new Process();
process.StartInfo.FileName = "atprogram.exe";
process.StartInfo.Arguments = "interactive";
// Set UseShellExecute to false for redirection.
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
// Redirect the standard output of the command.
// This stream is read asynchronously using an event handler.
process.StartInfo.RedirectStandardOutput = true;
// Set our event handler to asynchronously read the output.
process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
// Redirect standard input as well. This stream is used synchronously.
process.StartInfo.RedirectStandardInput = true;
process.Start();
// Start the asynchronous read of the output stream.
process.BeginOutputReadLine();
String inputText;
do
{
inputText = Console.ReadLine();
if (inputText == "q")
{
process.StandardInput.Close(); // After this line the output stream unblocks
Console.ReadLine();
return;
}
else if (!String.IsNullOrEmpty(inputText))
{
process.StandardInput.WriteLine(inputText);
}
}
}
J'ai aussi essayé de lire le flux de sortie standard synchrone, mais avec le même résultat. Toute méthode appelle indéfiniment le bloc de flux de sortie jusqu'à ce que le flux d'entrée soit fermé - même Peek()
et EndOfStream
.
Existe-t-il un moyen de communiquer avec l'autre processus en mode duplex intégral?
Pouvez-vous rendre asynchrone –
@BenderBending Oui je peux, mais est-ce que cela aidera? – Karsten
Je crois que ce serait. t le flux d'entrée sur un thread et le flux de sortie sur l'autre thread. –