• C#调用外部程序


    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
    被调用程序运行结束
     
  • 相关阅读:
    你看,那个人好像一条狗哎
    我竟然被抓去做了比特币挖矿工
    聊聊JAVA中 String类为什么不可变
    三分钟深入TT猫之故障转移
    shell实现两个数的相加
    shell截取字符串的方法
    Vi命令:如何删除全部内容?
    bash中不可以用字符串做数组下标
    awk打印出当前行的上一行
    awk同时处理多个文件
  • 原文地址:https://www.cnblogs.com/dongweian/p/16390492.html
Copyright © 2020-2023  润新知