我在将一些较旧的 Lua 5.1 代码移植到 Lua 5.2 时遇到了一些问题。我希望能够使用现有的 Lua 5.2 dll/lib,因此任何移植都需要使用现有的 Lua 5.2 API 完成。为了让它更复杂一点,我使用DllImport
P/Invoke 一些 Lua API 调用。这意味着#define
提供的任何快捷方式都不起作用。例如使用lua_pushglobaltable
将是不可能的。大多数更新都是必需的,因为LUA_REGISTRYINDEX
不再可访问。
到目前为止,我有以下内容:
1a) 更换
lua_pushstring(luaState, "tablename");
lua_settable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible
1b) 有
lua_setglobal(luaState, "tablename");
2a) 更换
lua_pushstring(luaState, "tablename");
lua_gettable(luaState, LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible
2b) 有
lua_getglobal(luaState, "tablename");
3a) 更换
lua_pushvalue(luaState, LUA_GLOBALSINDEX);
3b) 有
// not sure, something equivalent to lua_pushglobaltable(L)
4a) 更换
lua_replace(luaState, LUA_GLOBALSINDEX);
4b) 有
// I dont even have a guess here
5a) 更换
luaL_ref(luaState, (int)LuaIndexes.LUA_REGISTRYINDEX); // also luaL_unref
5b) 有
luaL_ref(luaState, <some arbitrary constant>); // this is probably wrong
6a) 更换
lua_rawgeti(luaState, LUA_REGISTRYINDEX, reference);
6b) 有
lua_rawgeti(luaState, <same arbitrary constant>, reference); // this is probably wrong
7a) 更换
lua_pcall(IntPtr luaState, int nArgs, int nResults, int errfunc);
7b) 有
lua_pcallk(IntPtr luaState, int nArgs, int nResults, int errfunc, int ctx, [MarshalAs(UnmanagedType.FunctionPtr)]LuaCSFunction function);
lua_pcallk(luaState, nArgs, nResults, errfunc, 0, null);
8a) 更换
lua_getfield(luaState, LUA_REGISTRYINDEX, meta);
8b) 有
luaL_setmetatable(IntPtr luaState, string meta);
9a) 更换
lua_rawset(luaState, LUA_REGISTRYINDEX);
9b) 有
lua_settable(luaState, -3);
现在一切都编译了,但是我得到了内存访问冲突异常,这意味着我可能错误地替换了一些东西。任何帮助,将不胜感激。