持续创作,加速成长!这是我参与「日新计划 6月更文挑战」的第6天,点击查看活动详情

@[TOC](InvalidProgramException: Invalid IL code in CC_Ctrl:getFixByPlatForm:IL_0008: ldc.i4.5)

报错译文:

无效的程序异常:无效的IL1代码 在 CC_Ctrl 类里面的getStr()这个方法:IL_0008: ldc.i4.5; 后面的这个[IL_0008: ldc.i4.5] 不清楚具体指的是什么,大致猜测是在IL_0008这个位置的 ldc.i4.5这个协议 的意思。


我犯的错:

我在CC_Ctrl 这个类里面的getFixByPlatForm是这样写的:

    string getFixByPlatForm()
    {
        string postfix = "";
        switch ("const string")//一个根据平台来设定的常亮
        {
            case "csdn.net":
                postfix = "_ 1"; //做某些操作
                break;
            case "jianshu.com":
                postfix = "_ 2";
                break;
            case "weibo.com":
                postfix = "_ 3";
                break;
            case "github.com":
            default:
                break;
        }
        Debug.Log("当前平台返回的后缀是:" + postfix);
        return postfix;
    }

我原文大概就是这么写的,不知道你看完是否看出了哪里有问题,如果看出来问题,那么产生的原因呢?你现在能说的清楚吗?

上面的代码当这个常量字符串 值 为 (“csdn.net” | “jianshu.com” | “weibo.com ” | “github.com” ) 时运行都没有问题。但是当这个常量匹配不到这个四个字符串时,会发生什么呢?

答案是:程序假死,调用这个方法的上面代码走完,就完事了,就像是在调用这个方法的位置上 直接return的效果是一样的,而且此时的UnityEditor并没有像想象中那样报错。当我意识到这个方法有问题的时候,我使用Try catch 试着捕获这个错误,你猜结果怎么样?

结果:当然是什么都没有捕获到,Editor都没有当然Try catch也是捕获不到的,但是这时我发现虽然错误是没有捕获到,调用这个方法【getFixByPlatForm()】的后面被执行了,也就是说确实是这个位置出现了问题。

至此我才找到出现问题的代码位置。


Editor报错:

虽然找到了报错代码的位置,也有可以解决问题方法,但是这时我并不知道这段程序具体是什么错误,直到我尝试修改时偶然间点击了两次调用的按钮,才看到文章标题Editor的报错,此标题就是报错原文,后面接这的是项目中代码通过谁调用来的,但是他并没有指定告诉我哪一行报错,告诉我的是这个方法【getFixByPlatForm()】

解决问题:

也许聪明的你从看到上面代码贴出来的时候就看到了有个case和default写到一起去了,当然这个写法是不对的,但是要不是这个写法错误,可能到现在我还不知道有这样的异常【 InvalidProgramException】存在。

  	case "github.com":
        default:
            break;

既然找到问题了,那么解决也就很轻松了。

针对我这里的问题 —-> 这个case “github.com” 没有做任何处理,那么直接删除,就可以了;或者说为了防止以后还会用那么在后面加一个 break;就可以了,这个两种方式的都试过了,是没有问题的。


虽然这个问题出现自一个写法错误,不过还是在其中有所收获。


  1. IL:IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码。↩