Reading output from another running application

后端 未结 3 1753
自闭症患者
自闭症患者 2020-12-17 00:55

I\'m working on a custom IDE in C# for a scripting language, and I have a problem.

I\'m trying to start the compiler process (pawncc.exe) and pass arguments to it. I

相关标签:
3条回答
  • 2020-12-17 01:23

    I dont have the pawnCC application so I cant try but it appears they restrict the verbosity of debugging information to external applications - apart from the command prompt.

    Can you try spawning the pawncc.exe via cmd:

    "cmd.exe \c CommandParameterToLaunchPawnCCwithArguments"
    
    0 讨论(0)
  • 2020-12-17 01:24

    You need to redirect the standard error stream as well:

    startInfo.RedirectStandardError = true;
    

    Edit: I just reviewed the code and discovered that you are only readonly the StandardOutput stream.

    I generally monitor the process for both the standard and error output streams using the DataReceived events on the process and adding the results into a stringbuilder, then storing the StringBuilder content in the UI element:

        private static System.Text.StringBuilder m_sbText;
    
        public Form3(string path)
        {
            InitializeComponent();
    
            this._path = path;
    
            Process myProcess = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo("pawncc.exe");
            startInfo.CreateNoWindow = true;
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            startInfo.Arguments = path + " -r -d2";
            myProcess.StartInfo = startInfo;
    
            m_sbText = new System.Text.StringBuilder(1000);
    
            myProcess.OutputDataReceived += ProcessDataHandler;
            myProcess.ErrorDataReceived += ProcessDataHandler;
    
            myProcess.Start();
    
            myProcess.BeginOutputReadLine();
            myProcess.BeginErrorReadLine();
    
            while (!myProcess.HasExited)
            {
                System.Threading.Thread.Sleep(500);
                System.Windows.Forms.Application.DoEvents();
            }
            RichTextBox1.Text = m_sbText.ToString();
        }
    
        private static void ProcessDataHandler(object sendingProcess, DataReceivedEventArgs outLine)
        {
            // Collect the net view command output. 
            if (!String.IsNullOrEmpty(outLine.Data))
            {
                // Add the text to the collected output.
                m_sbText.AppendLine(outLine.Data);
            }
        }
    

    There are obviously variations on this, but this should get you started.

    0 讨论(0)
  • 2020-12-17 01:24

    I've noticed some sporadic issues when dealing with the raw output/error streams from spawned processes in the past, hence why I usually deal with captured output via eventing:

    Process myProcess = new Process();
    ProcessStartInfo startInfo = new ProcessStartInfo("pawncc.exe");
    startInfo.CreateNoWindow = true;
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    startInfo.Arguments = path + " -r -d2";
    myProcess.EnableRaisingEvents = true;
    myProcess.OutputDataReceived += OnOutputDataReceived;
    myProcess.ErrorDataReceived += OnErrorDataReceived;
    myProcess.StartInfo = startInfo;
    myProcess.Start();
    myProcess.BeginOutputReadLine();
    myProcess.BeginErrorReadLine(); 
    
    0 讨论(0)
提交回复
热议问题