Skip to content

多次Dispose问题 #634

Closed
Closed
@virtualhu

Description

@virtualhu

运行时,一次正常Dispose env后,如果重新创建(不退出)一个evn加载代码运行,然后再次Dispose。会报 try to dispose a LuaEnv with C# callback!
而且调用 util.print_func_ref_by_csharp() 总是会打印出所有注册过的的函数,即使已经被释放了。

Activity

chexiongsheng

chexiongsheng commented on Sep 6, 2019

@chexiongsheng
Collaborator

重新创建(不退出)是什么意思呢?
最好给出可重现代码。

virtualhu

virtualhu commented on Sep 6, 2019

@virtualhu
Author

https://github.com/virtualhu/xLuaBugSample
问题示例请看这个。代码在 test.cs及main.lua.txt
演示的是,运行中反复释放env,创建evn并加载代码。在第一次做些操作时是正常的。从第2次开始就会报错。但是,如果在dispose前额外用Dostring执行一行lua代码,这个问题就不存在了。

virtualhu

virtualhu commented on Sep 8, 2019

@virtualhu
Author
chexiongsheng

chexiongsheng commented on Sep 9, 2019

@chexiongsheng
Collaborator

你这问题和c#的栈对象gc策略有关。你在当前栈帧使用那对象(LuaEntry.Dispose),所以该对象不一定会被释放;
方案1,在C#那赋值为空
方案2,把那个LuaEntry.Dispose调用放在两层嵌套的函数里调用,下面的代码就是方案2

public class test : MonoBehaviour {
  XLua.LuaEnv _env;

  public static System.Action eClick;
	// Use this for initialization
	void Start () {
    _ReloadLua();
  }

    void foo()
    {
        bar();
    }
    void bar()
    {
        if (LuaEntry.Dispose != null)
        {
            LuaEntry.Dispose();
            //_env.DoString(@"print('随便再执行一行lua代码,重新创建env就不会报错')");
        }
    }

  void _ReloadLua() {
    if (_env != null) {
            foo();
            //-----方案1 begin----
            //LuaEntry.Dispose = null;
            //LuaEntry.Init = null;
            //eClick = null;
            //-----方案1 end----
            _env.Dispose();
      _env = null;
    }
    _env = new XLua.LuaEnv();
    _env.DoString(@"require 'main'");
    if (LuaEntry.Init != null) {
      LuaEntry.Init();
    }
  }
	
	// Update is called once per frame
	void Update () {
		
	}

  private void OnGUI() {
    if (GUI.Button(new Rect(0, 0, 300, 100), "Click") && eClick != null) {
      eClick();
    }

    if (GUI.Button(new Rect(500, 0, 300, 100), "Reload")) {
      _ReloadLua();
    }
  }
}

上面两个方案都不需要调用到xlua的api就能解决,证明和xlua没啥关系。至于为啥DoString后可以,我猜和这里有pinvoke有关。

virtualhu

virtualhu commented on Sep 9, 2019

@virtualhu
Author

好的,非常感谢!
方案一不太方便使用,毕竟注册是在lua里,那释放也在lua会比较好管理。
只能用方案二

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @chexiongsheng@virtualhu

        Issue actions

          多次Dispose问题 · Issue #634 · Tencent/xLua