简体   繁体   中英

How to redirect input and output of existing process c#

There are two endpoints, I am thinking to add one endpoint to start the process and another is to do process communication(stdin/stdin). Is it possible? Or should I use some other ways to do this like websocket?

I am trying to start a process as below.

            Process process = new Process();

            ProcessStartInfo procStartInfo = new ProcessStartInfo("/bin/sh");
            procStartInfo.RedirectStandardError = true;
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.RedirectStandardInput = true;
            procStartInfo.UseShellExecute = false;
            procStartInfo.Arguments = "-c " + Constants.CMDName + args;
            process.StartInfo = procStartInfo;
            Console.WriteLine("Start res: " + process.Start());

Process is getting started but when I am trying to do stdin/out like below I am getting an error saying StandardIn not redirected.

        Process[] processes = Process.GetProcessesByName(Constants.VSDebugProcessName);
        if (processes.Length == 0)
        {
            throw new Exception("Process is not running");
        }
        Console.WriteLine(JsonSerializer.Serialize(processes[0].StartInfo));
        var process = processes[0];
        StreamWriter sw = process.StandardInput;
        await sw.WriteLineAsync(JsonSerializer.Serialize(payload));

Should I combine these two endpoints or is there any other workaround for this issue?

You can set EnableRaisingEvents = true in the ProcessStartInfo , and add a handler on the process's OutputDataReceived message to collect the output. The following snippet illustrates the procedure. It also handles error output (stderr).

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = fileName,
        Arguments = arguments,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false,
    },
    EnableRaisingEvents = true,
};

var output = new StringBuilder();
var error = new StringBuilder();

process.OutputDataReceived += (_, args) =>
{
    output.AppendLine(args.Data);
};

process.ErrorDataReceived += (_, args) =>
{
    error.AppendLine(args.Data);
};

process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
ResultsText.Value = output.ToString();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM