学习笔记 – Jtro的技术分享,外部调起unity程序,unity程序调起exe失败的问题解决

当前我在做的是这样一个功能,网页上点击一个按钮,然后调起一个unity项目管理器,说的管理器,也就是通过管理器打开unity程序,如果本地安装了unity程序,就直接打开,如果本地没有,或者更新了unity 程序,那么这个管理器还需要更新这个unity程序.流程大概是这样.那么遇到的问题是:unity程序里面有串口通讯的功能,既然有串口通讯,那么就肯定会有获取串口的功能,但是这个功能没有写在unity中,我是写了一个控制台程序,获取到串口号,再传给unity.

那么流程清晰了

网页点击打开按钮->调起unity管理器(根据网页的参数打开或下载对应的unity程序)->unity需要打开exe获取串口号.

但是在跑流程的时候遇到的问题是:如果直接双击打开unity程序,获取到串口号是没有问题的,上位机与下位机通讯都正常,但是如果在网页中通过按钮打开unity程序,就不会获取到串口号,也就是说unity没能打开它专用的获取串口号的exe程序

一开始,我以为是因为放在C盘的原因,因为C盘是禁止一些敏感操作的,后来放在D盘,发现还是这样.

分析问题:既然双击unity程序可以正常打开,那么就说明unity本身这块的程序是没有问题的.通过管理器打开失败,基本确定问题出在管理器.

那么先看看管理器是怎么打开unity程序的

Process.Start(Contant.AppPath + Contant.VirtualVision + @"\" + Contant.VirtualVision + ".exe");

这样调起exe是没有问题的,但是搜索到msdn上的解释:

1.png

也就是说通过System.Diagnostics.Process.Start()打开的程序是一个独立的exe文件

但是如果被System.Diagnostics.Process.Start()打开的这个程序还需要调用配置文件或者是其他的什么文件,则必须设置WorkingDirectory,将工作目录指向需要被调用的配置文件所在的目录。否则,这个通过System.Diagnostics.Process.Start()打开的程序将会找不到该配置文件。

所以要将以前的打开方式变化一下:

 Process process = new Process();
                            process.StartInfo.FileName = Contant.AppPath + Contant.VirtualVision + @"\" + Contant.VirtualVision + ".exe";
                            //MessageBox.Show(process.StartInfo.FileName);
                            process.StartInfo.WorkingDirectory = Contant.AppPath + Contant.VirtualVision;
                            process.Start();

改成这样之后,通过网页打开unity程序后,unity自己能打开获取串口号的信息,软硬件结合的数据通讯问题到这就解决了.

正文完