XLua_热更新学习五,“try to dispose a LuaEnv with C# callback!”报错

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

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 LuaEnv with C# callback!”报错)