protected void InitLuaLib()
        {
            if (mLuaState == null)
            {
                mLuaState = LuaAPI.NewState();
                mLuaState.L_OpenLibs();
                LuaEncLib.OpenLib(mLuaState);
            }
            string entryFileName = LUAEntryFileName;

            if (null != entryFileName && entryFileName.Length > 0)
            {
                var status = mLuaState.L_DoFile(entryFileName);
                if (status != ThreadStatus.LUA_OK)
                {
                    throw new Exception(mLuaState.ToString(-1));
                }
                if (!mLuaState.IsTable(-1))
                {
                    throw new Exception("entry main's return value is not a table");
                }
                OnEntryFileOvered(mLuaState.ToObject(-1) as LuaTable);
                string[] funcList = MethodNameList();
                if (null != funcList)
                {
                    for (int i = 0; i < funcList.Length; ++i)
                    {
                        var s = funcList[i];
                        if (mLuaFunctionRefs.ContainsKey(s))
                        {
#if !UNITY_3 && !UNITY_4 && !UNITY_5
                            FileLogMgr.OutToFileW("注册方法[{0}时发现同名的方法,删掉老的注册新的!", s);
#else
                            Debug.LogWarning("注册方法" + s + "时发现同名的方法,删掉老的注册新的!");
#endif
                            //UnStoreMethod(s, mLuaFunctionRefs[s]);
                            mLuaFunctionRefs.Remove(s);
                        }
                        int funcRef = StoreMethod(s);
                        mLuaFunctionRefs.Add(s, funcRef);
                    }
                }
                mLuaState.Pop(1);
            }
        }
        private T CallMethod <T>(int funcRef, bool traceBack, params object[] plist)
        {
            mLuaState.RawGetI(LuaDef.LUA_REGISTRYINDEX, funcRef);
            var b = 0;

            if (traceBack)
            {
                // insert `traceback' function
                b = mLuaState.GetTop();
                mLuaState.PushCSharpFunction(Traceback);
                mLuaState.Insert(b);
            }
            int pCount = 0;

            if (null != plist)
            {
                for (int i = 0; i < plist.Length; ++i)
                {
                    var s = plist[i];
                    //FileLogMgr.OutToFileD("CallMethod:PushString=" + s);
                    if (s is byte)
                    {
                        mLuaState.PushNumber((byte)s);
                    }
                    else if (s is sbyte)
                    {
                        mLuaState.PushNumber((sbyte)s);
                    }
                    else if (s is short)
                    {
                        mLuaState.PushNumber((short)s);
                    }
                    else if (s is ushort)
                    {
                        mLuaState.PushNumber((ushort)s);
                    }
                    else if (s is int)
                    {
                        mLuaState.PushNumber((int)s);
                    }
                    else if (s is uint)
                    {
                        mLuaState.PushNumber((uint)s);
                    }
                    else if (s is long)
                    {
                        mLuaState.PushNumber((long)s);
                    }
                    else if (s is ulong)
                    {
                        mLuaState.PushNumber((ulong)s);
                    }
                    else if (s is float)
                    {
                        mLuaState.PushNumber((float)s);
                    }
                    else if (s is double)
                    {
                        mLuaState.PushNumber((double)s);
                    }
                    else if (s is bool)
                    {
                        mLuaState.PushBoolean((bool)s);
                    }
                    else if (s is string)
                    {
                        mLuaState.PushString(s as string);
                    }
                    pCount++;
                }
            }
            var status = mLuaState.PCall(pCount, 1, b);

            if (status != ThreadStatus.LUA_OK)
#if !UNITY_3 && !UNITY_4 && !UNITY_5
            { FileLogMgr.OutToFileE(mLuaState.ToString(-1)); }
#else
            { Debug.LogError(mLuaState.ToString(-1)); }
#endif
            if (traceBack)
            {
                // remove `traceback' function
                mLuaState.Remove(b);
            }
            T   ret      = default(T);
            int retValue = mLuaState.GetTop();
            if (ret is string)
            {
                ret = (T)(object)mLuaState.ToString(retValue);
            }
            else if (ret is bool)
            {
                ret = (T)(object)mLuaState.ToBoolean(retValue);
            }
            else if (ret is float || ret is double || ret is byte || ret is sbyte || ret is short || ret is ushort ||
                     ret is int || ret is uint)
            {
                if (ret is long || ret is ulong)
                {
                    ret = (T)Convert.ChangeType(mLuaState.ToUInt64(retValue), typeof(T));
                }
                else
                {
                    ret = (T)Convert.ChangeType(mLuaState.ToNumber(retValue), typeof(T));
                }
            }
            mLuaState.Pop(1);
            return(ret);
        }
        private void CallMethod(int funcRef, bool traceBack, params object[] plist)
        {
            mLuaState.RawGetI(LuaDef.LUA_REGISTRYINDEX, funcRef);
            // insert `traceback' function
            var b = 0;

            if (traceBack)
            {
                b = mLuaState.GetTop();
                mLuaState.PushCSharpFunction(Traceback);
                mLuaState.Insert(b);
            }
            int pCount = 0;

            if (null != plist)
            {
                for (int i = 0; i < plist.Length; ++i)
                {
                    var s = plist[i];
                    if (s is byte)
                    {
                        mLuaState.PushNumber((byte)s);
                    }
                    else if (s is sbyte)
                    {
                        mLuaState.PushNumber((sbyte)s);
                    }
                    else if (s is short)
                    {
                        mLuaState.PushNumber((short)s);
                    }
                    else if (s is ushort)
                    {
                        mLuaState.PushNumber((ushort)s);
                    }
                    else if (s is int)
                    {
                        mLuaState.PushNumber((int)s);
                    }
                    else if (s is uint)
                    {
                        mLuaState.PushNumber((uint)s);
                    }
                    else if (s is long)
                    {
                        mLuaState.PushNumber((long)s);
                    }
                    else if (s is ulong)
                    {
                        mLuaState.PushUInt64((ulong)s);
                    }
                    else if (s is float)
                    {
                        mLuaState.PushNumber((float)s);
                    }
                    else if (s is double)
                    {
                        mLuaState.PushNumber((double)s);
                    }
                    else if (s is bool)
                    {
                        mLuaState.PushBoolean((bool)s);
                    }
                    else if (s is string)
                    {
                        mLuaState.PushString(s as string);
                    }
                    pCount++;
                }
            }
            var status = mLuaState.PCall(pCount, 0, b);

            if (status != ThreadStatus.LUA_OK)
#if !UNITY_3 && !UNITY_4 && !UNITY_5
            { FileLogMgr.OutToFileE(mLuaState.ToString(-1)); }
#else
            { Debug.LogError(mLuaState.ToString(-1)); }
#endif
            if (traceBack)
            {
                // remove `traceback' function
                mLuaState.Remove(b);
            }
        }