国庆后上班,领导要求给一个模块写一个PC测试软件,功能要求很简单,读取配置文件,然后根据文件中的数据对模块进行依次定时查询/设置,加上测试用了三天时间(注:用本人电脑做的测试),最后是发给同事,但在他的电脑都无法运行,双击软件没有任何反应。
需要说明一下:我的电脑是32位的win8系统,64位win7系统
软件我使用32位的VS2010编写的,.net framework是4.0的
看到这个情况,我首先想到的是同事的电脑没有 .net framework 4.0,但是根据以往的经验,如果.net framework 版本不够或者没有安装.net framework,运行软件的话,都会有对话框提示的,但这次没有,为了排除这个问题,我在另外一个同事(32位 xp 系统)的电脑上安装了.net framework 4.0 ,然后运行该软件,依然没有任何界面或者提示框出现。既然不是运行环境的问题,第二个想到的就是操作系统,但是C#默认的目标平台是“Any CPU”,按道理,这个软件对于32位和64位系统都应该能运行的,为了以防万一,我做了两个软件,1---生成 目标平台为"X86"的软件,2---生成一个目标平台为“X64”的软件,可是这两个软件无论是在32位的系统中还是在64位的系统中都无法运行。
但是以前的其他软件却可以运行,单单这次就不行。而以前的软件的目标框架是.net framework 2.0 或者 .net framework 3.5,会不会是这次用的.net framework 4.0太高了?并且.net framework 4.0 只能在win8以上的系统中才能用?带着这个疑问,我将这个测试软件的目标框架改为.net framework 3.5,不能运行,改为.net framework 2.0还是不能运行。正是奇怪,就这样,陷入了僵局,没了头绪,google/百度都没结果。黔驴技穷,只能用笨方法了---用以前的软件改,用以前软件的解决方案,改里面的代码,这样总不存在框架问题了吧,界面改动下,代码复制一下(代码不涉及到运行环境问题,仅仅是数据处理和逻辑判断),很快就改完了,这次总可以交差了吧,心中美美的想着,发给同事,还是不能运行。
疯了,彻底被击败了。看来问题应该出现在代码中,可是调试没有问题,在我电脑中运行也没出现异常。被击败了,可是问题还是得解决啊,把同事的电脑接过来,还是在以前的软件上改,但这次不一样,改一部分,就在同事的电脑上运行一下,这样应该就可以确定问题了吧。通过这个方法终于找到问题的根源了:
string[] ports = SerialPort.GetPortNames(); serialPort1.PortName = ports[0].Trim();
明眼人一看应该知道是什么问题了吧!其实,当确定是这两行代码搞得鬼的时候,我也知道是什么问题了。在这个软件的另外一个地方也有这两行代码,但稍有不同:
string[] ports = SerialPort.GetPortNames(); comboBox_portname.Items.AddRange(ports); if (string.IsNullOrEmpty(wm.serialPort1.PortName)) { if (comboBox_portname.Items.Count > 0) { comboBox_portname.SelectedIndex = 0; } } else { comboBox_portname.Text = wm.serialPort1.PortName; }
对比这两段代码,问题就更明显了吧。
总结下:问题就是没有对ports这个string 数组的长度进行调用前的判断。
而为什么在我的电脑上可以运行,在其他人的电脑上就不行呢?那是因为在没有接串口线的情况下,我的电脑也会有一个COM口,其他人的电脑在没有接串口线的情况下,是没有COM口的。
其实,还有一种方法可以很快的找到问题,那就是 try{}catch{},可能是人为这个测试软件太简单了吧,在异常处理上没有像其他软件那样做的很细致,这也是一个问题,而且是一个很严肃的问题,故借此文诫勉自己!