【C#】【语法】C#中 ProcessStartInfo、process启动一个外部程序
在 C# 中,ProcessStartInfo
类是 System.Diagnostics
命名空间中的一部分,它用于控制 Process
类启动新进程时的各种设置。所以在定义了一个ProcessStartInfo
之后还得定义一个Process
并将前者的设置绑定给后者。
示例:
ProcessStartInfo psi = new ProcessStartInfo { FileName = FrmNewProject.GetFolderPath() + "\\python\\dist\\Solver_test.exe", RedirectStandardInput = true,//将标准输入流重定向,允许程序向cmd发送命令。 RedirectStandardOutput = true,//将标准输出流重定向,允许程序捕获cmd的输出。 RedirectStandardError = true,//将错误输出流重定向,允许程序捕获cmd的错误信息。 UseShellExecute = false,//禁用shell的使用,这是必需的,因为需要重定向输入/输出流。 CreateNoWindow = true,//启动进程时不创建新窗口,使其在后台运行。 WorkingDirectory = FrmNewProject.GetFolderPath() + "\\python\\dist" ,// 设置工作目录为exe文件的目录 Arguments = $"\"{general_file}\" \"{topo_info}\" \"{stream_info}\" \"{result_final}\"" }; Process process = new Process { StartInfo = psi }; process.Start(); // 如果需要,向EXE发送输入 // process.StandardInput.WriteLine("some input"); //当你设置了 RedirectStandardOutput 和 RedirectStandardError,你已经告诉系统把这些输出重定向到你的应用程序控制的流中。然而,这些信息并不会自动显示在Visual Studio的输出窗口或其他地方;你需要主动从这些流中读取数据。
string output = process.StandardOutput.ReadToEnd();//读取进程的标准输出流到结束,通常包括命令的执行结果。
string errors = process.StandardError.ReadToEnd();//读取进程的错误输出流到结束,捕获执行过程中可能发生的错误。
process.WaitForExit();//等待进程结束,确保所有操作完成后再继续。 // 处理输出和错误 Console.WriteLine(output); Console.Error.WriteLine(errors);
ProcessStartInfo主要属性
- FileName:要执行的文件的名称。这通常是可执行文件的路径,但也可以是任何系统可以识别的文档或文件。
- Arguments:与
FileName
属性一起使用的命令行参数。 - WorkingDirectory:进程启动时的当前工作目录。默认情况下,这是当前进程的工作目录。
- UseShellExecute:指示是否使用操作系统的 shell 来启动进程。如果
false
,则直接从创建的进程中运行可执行文件;如果true
,则通过操作系统的 shell 执行。 - CreateNoWindow:如果设置为
true
,则不会为新进程创建窗口。 - RedirectStandardOutput、RedirectStandardError、RedirectStandardInput:这些属性允许您重定向进程的输入、输出和错误流。这在需要从代码中读取或写入进程的输出时非常有用。
这里WorkingDirectory这一项在调用启动类似python或者bat这些脚本文件的时候很重要,因为脚本文件中经常会有以当前目录为工作目录选择上层或下层目录的情况。如果WorkingDirectory没有选择正确会导致这些代码执行失败。
重定向输出
最后将输出重定向到运行c#的输出终端时,不仅仅是往ProcessStartInfo定义里加了:
RedirectStandardInput = true,//将标准输入流重定向,允许程序向cmd发送命令。 RedirectStandardOutput = true,//将标准输出流重定向,允许程序捕获cmd的输出。 RedirectStandardError = true,//将错误输出流重定向,允许程序捕获cmd的错误信息。
就可以了,因为当你设置了 RedirectStandardOutput 和 RedirectStandardError,你已经告诉系统把这些输出重定向到你的应用程序控制的流中。然而,这些信息并不会自动显示在Visual Studio的输出窗口或其他地方;你需要主动从这些流中读取数据。也就是要使用process的这两个方法:
string output = process.StandardOutput.ReadToEnd();//读取进程的标准输出流到结束,通常包括命令的执行结果。 string errors = process.StandardError.ReadToEnd();//读取进程的错误输出流到结束,捕获执行过程中可能发生的错误。