c#调用lua
2020-12-23 23:28
                         标签:inter   忽略   c中   委托   UNC   ted   net   weakref   ignore        c#调用lua 标签:inter   忽略   c中   委托   UNC   ted   net   weakref   ignore    原文地址:https://www.cnblogs.com/wang-jin-fu/p/13508804.htmlDoString(init_xlua, "Init");
public object[] DoString(byte[] chunk, string chunkName = "chunk", LuaTable env = null)
    {
#if THREAD_SAFE || HOTFIX_ENABLE
        lock (luaEnvLock)
        {
#endif
            var _L = L;
            int oldTop = LuaAPI.lua_gettop(_L);
            int errFunc = LuaAPI.load_error_func(_L, errorFuncRef);
            if (LuaAPI.xluaL_loadbuffer(_L, chunk, chunk.Length, chunkName) == 0)
            {
                if (env != null)
                {
                    env.push(_L);
                    LuaAPI.lua_setfenv(_L, -2);
                }
 
                if (LuaAPI.lua_pcall(_L, 0, -1, errFunc) == 0)
                {
                    LuaAPI.lua_remove(_L, errFunc);
                    return translator.popValues(_L, oldTop);
                }
            }
            return null;
#if THREAD_SAFE || HOTFIX_ENABLE
    }
#endif
}
LUALIB_API int xluaL_loadbuffer (lua_State *L, const char *buff, int size,
                                const char *name) {
   return luaL_loadbuffer(L, buff, size, name);
}
if (0 != LuaAPI.xlua_getglobal(rawL, "_G"))
{
    throw new Exception("get _G fail!");
}
translator.Get(rawL, -1, out _G);
private object getLuaTable(RealStatePtr L, int idx, object target)
{
    if (LuaAPI.lua_type(L, idx) == LuaTypes.LUA_TUSERDATA)
    {
        object obj = translator.SafeGetCSObj(L, idx);
        return (obj != null && obj is LuaTable) ? obj : null;
    }
    if (!LuaAPI.lua_istable(L, idx))
    {
        return null;
    }
    LuaAPI.lua_pushvalue(L, idx);
    return new LuaTable(LuaAPI.luaL_ref(L), translator.luaEnv);
}
private object getLuaFunction(RealStatePtr L, int idx, object target)
{
    if (LuaAPI.lua_type(L, idx) == LuaTypes.LUA_TUSERDATA)
    {
        object obj = translator.SafeGetCSObj(L, idx);
        return (obj != null && obj is LuaFunction) ? obj : null;
    }
    if (!LuaAPI.lua_isfunction(L, idx))
    {
        return null;
    }
    LuaAPI.lua_pushvalue(L, idx);
    return new LuaFunction(LuaAPI.luaL_ref(L), translator.luaEnv);
}
int errFunc = LuaAPI.load_error_func(L, luaEnv.errorFuncRef);
LuaAPI.lua_getref(L, luaReference);//lua_function压栈。
if (args != null)
{
    nArgs = args.Length;
    for (int i = 0; i )
    {
        translator.PushAny(L, args[i]);//参数压栈
    }
}
int error = LuaAPI.lua_pcall(L, nArgs, -1, errFunc);//调用
public object CreateDelegateBridge(RealStatePtr L, Type delegateType, int idx)
{
    LuaAPI.lua_pushvalue(L, idx);
    LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX);
    if (!LuaAPI.lua_isnil(L, -1))//之前加载过,走缓存
    {
        int referenced = LuaAPI.xlua_tointeger(L, -1);
        LuaAPI.lua_pop(L, 1);
 
        if (delegate_bridges[referenced].IsAlive)
        {
            if (delegateType == null)
            {
                return delegate_bridges[referenced].Target;
            }
            DelegateBridgeBase exist_bridge = delegate_bridges[referenced].Target as DelegateBridgeBase;
            Delegate exist_delegate;
            if (exist_bridge.TryGetDelegate(delegateType, out exist_delegate))
            {
                return exist_delegate;
            }
            ...
        }
    }
    else //第一次加载
    {
        LuaAPI.lua_pushvalue(L, idx);
        int reference = LuaAPI.luaL_ref(L);
        LuaAPI.lua_pushvalue(L, idx);
        LuaAPI.lua_pushnumber(L, reference);
        LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX);
        //栈:lua_func
        //register[lua_func] = ref_id
        DelegateBridgeBase bridge;
        bridge = new DelegateBridge(reference, luaEnv);//省略一部分,最终走的是这边,每个lua_function都会是生成一个bridge,并把对应的ref_id赋值给bridge. reference
        try {
            var ret = getDelegate(bridge, delegateType);
            bridge.AddDelegate(delegateType, ret);
            delegate_bridges[reference] = new WeakReference(bridge);
            return ret;
        }
    }
}
Delegate getDelegate(DelegateBridgeBase bridge, Type delegateType)
{
    Delegate ret = bridge.GetDelegateByType(delegateType);
 
    if (ret != null)
    {
        return ret;
    }
    ...//忽略特殊情况
}
if (type == typeof(System.Actionint>))
{
    return new System.Actionint>(__Gen_Delegate_Imp2);//创建新的Action并返回。
}
 
public void __Gen_Delegate_Imp2(int p0)
{
#if THREAD_SAFE || HOTFIX_ENABLE
    lock (luaEnv.luaEnvLock)
    {
#endif
        RealStatePtr L = luaEnv.rawL;
        int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference);//方法压栈           
        LuaAPI.xlua_pushinteger(L, p0);  //参数压栈             
        PCall(L, 1, 0, errFunc);                         
        LuaAPI.lua_settop(L, errFunc - 1); //lua方法调用            
#if THREAD_SAFE || HOTFIX_ENABLE
    }
#endif
}
Actionint> sceneLoad;
sceneLoad = luaEnv.Global.GetInPath
