Unity | 调用外部exe

一、调用另一个Unity EXE软件

    /// <summary>
    /// 打开外部程序
    /// </summary>
    /// <param name="_exePathName">EXE所在绝对路径及名称,带后缀.exe</param>
    /// <param name="_exeArgus">启动参数</param>
    public static void StartEXE(string _exePathName, string _exeArgus)
    {
        try
        {
            System.Diagnostics.Process myprocess = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(@_exePathName, _exeArgus);
            myprocess.StartInfo = startInfo;
            myprocess.StartInfo.UseShellExecute = false;
            myprocess.Start();
        }
        catch (Exception ex)
        {
           Debug.Log("加载exe失败," + ex.Message);
        }
    }

二、调用控制台应用程序

加载控制台应用程序需要设置WorkingDirectory属性(猜测原因:我项目中加载的控制台应用程序启动时要调用别的dll,这个dll要加载本地模型文件,所以需要设置exe的当前工作目录),否则会加载失败。

    /// <summary>
    /// 打开外部程序
    /// </summary>
    /// <param name="_exePathName">EXE所在绝对路径,不带名称</param>
    /// <param name="_exeName">exe名称,带后缀</param>
    public static void StartEXE(string _exePathName,string _exeName)
    {
        try
        {
            System.Diagnostics.Process myprocess = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(@_exePathName+ "/"+_exeName);
            myprocess.StartInfo = startInfo;
            myprocess.StartInfo.WorkingDirectory = @_exePathName;
            myprocess.StartInfo.CreateNoWindow = true;
            myprocess.StartInfo.UseShellExecute = false;
            myprocess.StartInfo.RedirectStandardOutput = true;
            myprocess.Start();
        }
        catch (Exception ex)
        {
            Debug.Log("加载exe失败," + ex.Message);
        }
    }

三、关闭进程

    /// <summary>
    /// 杀死进程
    /// </summary>
    /// <param name="_exePathName">进程名称,不带路径及后缀</param>
    public static void CloseExe(string _exePathName)
    {
        System.Diagnostics.Process[] progress = System.Diagnostics.Process.GetProcessesByName(_exePathName);
        Debug.Log("progress个数:" + progress.Length);
        for (int i = 0; i < progress.Length; i++)
        {
            progress[i].Kill();
        }
    }

四、路径加载注意事项

如果第三方exe的路径是通过config.txt配置的,那么读取这个路径字符串时需要注意:

  1. 方式一

路径字符串单独一行。那么读取字符串时要注意其length比实际字符串多1位,所以要进行字符串处理。

  • 配置文件

C:\Users\fengchujun\Desktop\zhanhuiexe\pipiGame\PipiDriver.exe
  • 读取路径字符串

  IEnumerator GetConfigData()
    {
        using (UnityWebRequest w = UnityWebRequest.Get(Application.streamingAssetsPath + "/configV2.1.0.txt"))
        {
            yield return w.SendWebRequest();
            if (w.isNetworkError || w.isHttpError)
            {
                Debug.Log("GetConfig error");
            }
            else
            {
                string data = w.downloadHandler.text;
                string[] _array = data.Split('\n', System.StringSplitOptions.RemoveEmptyEntries);
              
                ExePath=_array[0];
            }
        }
    }
  • 字符串处理及调用

 if (ExePath != "")
 {
      string  path = @ExePath.Substring(0,ExePath.Length-1);
      Debug.Log(path.Length+":"+ path);
      StartEXE(path, null);
 }
  1. 方式二

路径按空格分割的方式和别的数据在一行,那么这个路径字符串不需要处理。

  • 配置文件

(注意exe后有空格)

1080 720 25 2 5 14 17 C:\Users\fengchujun\Desktop\zhanhuiexe\pipiGame\PipiDriver.exe 
  • 读取路径字符串

 IEnumerator GetConfig()
  {
        using (UnityWebRequest w = UnityWebRequest.Get(Application.streamingAssetsPath + "/config.txt"))
        {
            yield return w.SendWebRequest();
            if (w.isNetworkError || w.isHttpError)
            {
                Debug.Log("GetConfig error");
            }
            else
            {
                string info = w.downloadHandler.text;
                string[] _array = info.Split('\n', System.StringSplitOptions.RemoveEmptyEntries);
                Debug.Log(_array.Length);

                //get cameraInfo
                string[] cameraInfo = _array[0].Split(' ', System.StringSplitOptions.RemoveEmptyEntries);
                Debug.Log(cameraInfo.Length);
                //...
                softExePath= cameraInfo[7];
            }
       } 
}
  • 调用

    /// <summary>
    /// 开启第三方exe
    /// </summary>
    /// <returns></returns>
    void StartExe()
    {
        CommonData.WriteIntoTxt("第三方软件exe:" + softExePath);
        if (softExePath != "")
        {
            CommonData.StartEXE(softExePath, null);
        }
    }

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值