xLua icon indicating copy to clipboard operation
xLua copied to clipboard

当一个根命名空间与某个内部类重名时,Android平台上会混淆命名空间和此内部类型,附带修复方案

Open Sivory opened this issue 2 years ago • 2 comments

重现环境:Unity版本2020.3.37f1,Xlua版本2.1.16,编译设置:IL2CPP .NET Standard 2.0 重现步骤:

  1. 创建C#类型Game.A.B.C.Main随便实现一些静态方法
  2. 创建C#类型Proto.SomeClass并在其中定义一个内部类型Game
  3. 在Lua代码中调用CS.Game.A.B.C.Main.XXX
  4. 在PC上运行正常,编译为Android后,报错

修复方案:将StaticLuaCallbacks.ImportType方法中代码“if (type!=null)”修改为"if (type!=null && type.FullName == className)

复现项目: XLuaBug.zip

Sivory avatar Aug 01 '22 16:08 Sivory

大佬nb,我也遇到了个问题,确实解决了!方便解释一下为什么这样修复吗?

kimomi avatar Sep 15 '22 13:09 kimomi

@kimomi image 我看unity最新的2020.3.38版本有这样一条修复信息,估计是由于il2cpp底层的bug。就像修复信息中所说,问题的根源在于在我提交的项目中,Assembly.GetType("Game")本应返回null,却错误地返回了一个内部嵌套类Game,xLua在解析CS.Game时不会把它当成命名空间而是当成了一个内部嵌套类,所以出了问题。解决思路也很简单,就是在xLua解析过程中加多一层检查,规避Unity的底层Bug

Sivory avatar Sep 15 '22 13:09 Sivory