在C#中,通过Process
类来进行进程操作。 Process
类在System.Diagnostics
包中,具体使用如下所示:
Process.Start(processName)
对于比较复杂的调用,例如给被调用程序传入参数,以及从被调用程序获取数据,此时需要设定Process
的StartInfo
参数,具体设定如下所示:
static void Main(string[] args) { try { var process = new Process() { StartInfo = new ProcessStartInfo() { // 启动程序名称 FileName = "Hk.Console.Callee.exe", // 对启动程序所传递的参数。如果参数包含空格则使用"\"\""取消空格转义 Arguments = "123 \"C:\\Program Files (x86)\\JetBrains\\ETW Host\"", // 是否展示被调用程序 CreateNoWindow = false, // 是否需要系统shell调用程序 UseShellExecute = false, // 打开文本输出 RedirectStandardOutput = true, // 打开错误输出 RedirectStandardError = true, } }; // 程序输出回调 process.OutputDataReceived += Process_OutputDataReceived; process.ErrorDataReceived += Process_ErrorDataReceived; //启动程序 process.Start(); // 启动文本输出 process.BeginOutputReadLine(); // 启动错误输出 process.BeginErrorReadLine(); System.Console.WriteLine("被调用程序启动成功"); // 等待程序结束 process.WaitForExit(); } catch (Exception e) { System.Console.WriteLine(e); } finally { System.Console.WriteLine("被调用程序运行结束"); System.Console.ReadKey(); } } /// <summary> /// 通过System.Console.WriteLine输出的信息回调 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e) { System.Console.WriteLine($"被调用程序OutputDataReceived:{e.Data}"); } /// <summary> /// 通过System.Console.Error.WriteLine输出的信息回调 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e) { System.Console.WriteLine($"被调用程序ErrorDataReceived:{e.Data}"); }
被调用程序的测试如下所示:
static void Main(string[] args) { if (args?.Length > 0) { foreach (var param in args) { System.Console.WriteLine($"被调用程序输入参数:{param}"); } } else { System.Console.Error.WriteLine($"被调用程序输入参数为空"); } }
当程序不传入参数时,此时调用程序输出信息如下:
被调用程序启动成功 被调用程序ErrorDataReceived:被调用程序输入参数为空 被调用程序运行结束
当程序传入如上所示参数时,此时调用程序输出信息如下:
被调用程序启动成功 被调用程序OutputDataReceived:被调用程序输入参数:123 被调用程序OutputDataReceived:被调用程序输入参数:C:\Program Files (x86)\JetBrains\ETW Host 被调用程序运行结束