C#调用外部程序
在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}");
}
2、测试程序
被调用程序的测试如下所示:
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
被调用程序运行结束