XLua_热更新学习五,“try to dispose a Lu
2019-05-22 本文已影响0人
菜鸟的笔记
上篇在关闭运行时会报错,,本篇解决这个问题
1.先看一下报的是什么错误

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'");
}