首页 > 技术文章 > C#调用外部程序

dongweian 2022-06-19 14:48 原文

1、C#调用外部程序

在C#中,通过Process类来进行进程操作。 Process类在System.Diagnostics包中,具体使用如下所示:

 Process.Start(processName)

对于比较复杂的调用,例如给被调用程序传入参数,以及从被调用程序获取数据,此时需要设定ProcessStartInfo参数,具体设定如下所示:

  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
被调用程序运行结束
 

推荐阅读