美文网首页
XLua_热更新学习五,“try to dispose a Lu

XLua_热更新学习五,“try to dispose a Lu

作者: 菜鸟的笔记 | 来源:发表于2019-05-22 11:28 被阅读0次

    上篇在关闭运行时会报错,,本篇解决这个问题

    1.先看一下报的是什么错误
    尝试使用c#回调来处理一个LuaEnv !
    2.解决方法在官方的FAQ中有说明
    调用LuaEnv.Dispose时,报“try to dispose a LuaEnv with C# callback!”错是什么原因?
    
    这是由于C#还存在指向lua虚拟机里头某个函数的delegate,为了防止业务在虚拟机释放后调用这些无效(因为其引用的lua函数所在虚拟机都释放了)delegate导致的异常甚至崩溃,做了这个检查。
    
    怎么解决?释放这些delegate即可,所谓释放,在C#中,就是没有引用:
    
    你是在C#通过LuaTable.Get获取并保存到对象成员,赋值该成员为null;
    
    你是在lua那把lua函数注册到一些事件事件回调,反注册这些回调;
    
    如果你是通过xlua.hotfix(class, method, func)注入到C#,则通过xlua.hotfix(class, method, nil)删除;
    
    要注意以上操作在Dispose之前完成。
    
    xlua提供了一个工具函数来帮助你找到被C#引用着的lua函数,util.print_func_ref_by_csharp,使用很简单,执行如下lua代码:
    
    local util = require 'xlua.util'
    util.print_func_ref_by_csharp()
    
    可以看到控制台有类似这样的输出,下面第一行表示有一个在main.lua的第2行定义的函数被C#引用着
    
    LUA: main.lua:2
    LUA: main.lua:13
    
    3.解决方法

    3.1 需要新建一个lua脚本来释放(通过xlua.hotfix(class, method, nil)删除;)。看代码—— fishDesNil.lua.txt

    print('报“try to dispose a LuaEnv with C# callback!”错 解决')
    --补丁 参数1:需要更改的C#类名。参数2:需要更改的方法名。参数3:lua方法(更改的内容)
    xlua.hotfix(CS.NewBehaviourScript,'OnButtonClick',nil)
    

    3.2 打开C#脚本HotFix 添加代码(HotFix代码详情看这里)

        private void OnDisable()
        {
            luaenv.DoString("require'fishDesNil'");
        }
    

    相关文章

      网友评论

          本文标题:XLua_热更新学习五,“try to dispose a Lu

          本文链接:https://www.haomeiwen.com/subject/mjsyzqtx.html