XLua运行时热更新原理与实现

function reload_module(module_name)
   local old_module = require (module_name) --获取老模块
   package.loaded[module_name] = nil    --赋值为空
   require (module_name)                --加载新模块
   local new_module = require (module_name)   --获取新模块
   for k, v in pairs(new_module) do     --循环新模块中的所有属性方法等内容
         old_module[k] = nil                    --把心模块的改变都塞给老模块
       old_module[k] = v                    --把心模块的改变都塞给老模块
   end
   package.loaded[module_name] = old_module --最后我们再把老模块塞回来。那么引用老模块的其他模块引用的东西也就改变了
end
[hotfix]
public class Calc
{
    int Add(int a, int b)
   {
        return a + b
   }
}

打了hotfix标签后,xLua会在il(中间语言)层面注入代码,注入之后这个类会类似这样:

public class Calc
{
    static Func<object, int, int, int> hotfix_Add = null;
    int Add(int a, int b)
   {
        if (hotfix_Add != null) return hotfix_Add(this, a, b);
        return a + b
   }
}

如果lua中执行了hotfix调用,hotfix_Add会指向一个lua的适配函数。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容