首页 > 其他分享 >Xlua热更流程

Xlua热更流程

时间:2023-04-24 16:23:44浏览次数:33  
标签:__ int 流程 Xlua Add TestXLua Hotfix0 public

转载自:深入理解xLua基于IL代码注入的热更新原理 - iwiniwin - 博客园 (cnblogs.com)

例子:

第一步:GenerateCode:为打了Hotfix标签的方法生成对应的匹配函数

[Hotfix]
public class TestXLua
{
    public int Add(int a, int b)
    {
        return a - b;  // 这里的Add方法故意写成减法,后面通过热更新修复
    }
}

会在配置的Gen目录下生成DelegatesGensBridge.cs文件,其中有为TestXLua.Add生成的对应的匹配函数__Gen_Delegate_Imp1

// DelegatesGensBridge.cs
public partial class DelegateBridge : DelegateBridgeBase
{
    // ...
    public int __Gen_Delegate_Imp1(object p0, int p1, int p2)
    {
#if THREAD_SAFE || HOTFIX_ENABLE
        lock (luaEnv.luaEnvLock)
        {
#endif
            RealStatePtr L = luaEnv.rawL;
            int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference);
            ObjectTranslator translator = luaEnv.translator;
            translator.PushAny(L, p0);
            LuaAPI.xlua_pushinteger(L, p1);
            LuaAPI.xlua_pushinteger(L, p2);
            
            PCall(L, 3, 1, errFunc);
            
            
            int __gen_ret = LuaAPI.xlua_tointeger(L, errFunc + 1);
            LuaAPI.lua_settop(L, errFunc - 1);
            return  __gen_ret;
#if THREAD_SAFE || HOTFIX_ENABLE
        }
#endif
    }
    // ...
}

这样的话,调用传递给C#的lua函数就相当于调用以"__Gen_Delegate_Imp"开头的生成函数,这个生成函数负责参数压栈,并通过保存的索引获取到真正的Lua function,然后使用lua_pcall完成Lua function的调用。

第二步:IL注入

为TestXlua添加一个名为"__Hotfix0_Add"的DelegateBridge类型的静态变量。并在原来的Add方法中注入判断静态变量是否不为空,如果不为空就调用静态变量所对应的Lua方法的逻辑。反编译已注入IL代码的Assembly-CSharp.dll,查看其中的TestXLua如下所示:

using System;
using XLua;

// Token: 0x02000016 RID: 22
[Hotfix(HotfixFlag.Stateless)]
public class TestXLua
{
    // Token: 0x06000051 RID: 81 RVA: 0x00002CE0 File Offset: 0x00000EE0
    public int Add(int a, int b)
    {
        DelegateBridge _Hotfix0_Add = TestXLua.__Hotfix0_Add;
        if (_Hotfix0_Add != null)
        {
            return _Hotfix0_Add.__Gen_Delegate_Imp1(this, a, b);
        }
        return a - b;
    }

    // Token: 0x06000052 RID: 82 RVA: 0x00002D14 File Offset: 0x00000F14
    public TestXLua()
    {
        DelegateBridge c__Hotfix0_ctor = TestXLua._c__Hotfix0_ctor;
        if (c__Hotfix0_ctor != null)
        {
            c__Hotfix0_ctor.__Gen_Delegate_Imp2(this);
        }
    }

    // Token: 0x04000022 RID: 34
    private static DelegateBridge __Hotfix0_Add;

    // Token: 0x04000023 RID: 35
    private static DelegateBridge _c__Hotfix0_ctor;
}

第三步:绑定Lua函数

在打补丁时通过xlua.hotfix为静态变量"__Hotfix0_Add"设置一个Lua函数。这样下次调用TestXLua.Add时,"__Hotfix0_Add"将不为空,此时将执行_Hotfix0_Add.__Gen_Delegate_Imp1,即调用设置的Lua函数,而不再执行原有逻辑。从而实现了C#热修复。

标签:__,int,流程,Xlua,Add,TestXLua,Hotfix0,public
From: https://www.cnblogs.com/mcyushao/p/17349921.html

相关文章

  • JAVA流程控制
    Java流程控制一、Scanner对象next():一定要读取到有效字符后才可以结束输入对输入有效字符之前遇到的空白,next()方法会自动将其去掉只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符next()不能得到带有空格的字符串nextLine():以Enter为结束符也就是说ne......
  • 分析需要修改的地方与SpringSecurity完整流程
    分析需要修改的地方 原理初探​想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。SpringSecurity完整流程SpringSecurity完整流程SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤......
  • SpringSecurity从入门到精通:如何查看具体的过滤器&入门案例认证流程图讲解
    如何查看具体的过滤器  入门案例认证流程图讲解 概念速查:Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户相关信息AuthenticationManager接口:定义了认证Authentication的方法UserDetailsService接口:加载用户特定数据的核心接口,里面定义了......
  • Innodb实现事务流程
    Innodb通过BufferPool,LogBuffer,RedoLog,UndoLog来实现事务,以update语句为例:Innodb在收到update语句后,会先根据条件找到数据所在⻚,并将该⻚缓存在BufferPool执⾏update语句,修改BufferPool中的数据针对update语句⽣成⼀个RedoLog对象,并存⼊LogBuffer针对update语句......
  • 抓交通肇事犯流程图及代码
    问题描述:一辆卡车违反交通规则,撞人后逃跑。现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。设计思路:   ......
  • apisix网关使用自研插件流程
    1. 关于apisix网关插件apisix插件分为内置插件和自编插件,本文主要介绍使用自研插件的流程,内置插件使用方法参考官方文档内置插件官方文档:https://apisix.apache.org/zh/docs/apisix/plugins/batch-requests/2. 使用自研插件的实现步骤apisix支持多种语言自研插件,本文主要介......
  • SAP SD 基本业务流程
                  物料客户价格客户-物料列表/排斥 加库存 信用管理(ECC) 创建MM01BP/FLCU1/XD01VK11VD51VB01 物料凭证(库存)migo(561) 客户信用主数据fd32 修改MM02BP/FLCU2/XD02VK12VD52VB02......
  • 软件开发工作总体流程图 、软件测试活动分布图、软件测试流程关系图
     软件测试的流程软件测试的流程一般要考虑3点:软件测试工作总体流程图、软件测试活动分布图和软件测试流程关系图。1.4.1软件开发工作总体流程图软件测试的流程图分为软件测试工作总体流程图、需求阶段测试工作流程图、设计与编码阶段测试工作流程图、集成测试和系统测试阶段工......
  • SpringMVC启动流程源码分析
    SpringMVC向WEB容器中注入了两个对象:ContextLoaderListener:由AbstractContextLoaderInitializer注入。DispatcherServlet:由AbstractDispatcherServletInitializer注入。下面分别分析这两个对象在WEB容器启动时做了什么工作?ContextLoaderListenerContextLoaderListener实现了Servle......
  • 退出登录、认证配置详解、权限系统的作用、授权基本流程
    退出登录我们只需要定义一个登录接口,然后获取SecurityContextHolder中的认证信息,删除redis中对应的数据即可。LoginController控制层@RestControllerpublicclassLoginController{@AutowiredprivateLoginServiceloginService;@RequestMapping("/user/lo......