c# – 从Lua 5.1移植到5.2

我有一些问题将一些旧的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 errfunc,int ctx,[MarshalAs(UnmanagedType.FunctionPtr)]LuaCSFunction function);
lua_pcallk(luaState,nArgs,nResults,errfunc,null);

8a)更换

lua_getfield(luaState,Meta);

8b)随着

luaL_setMetatable(IntPtr luaState,string Meta);

9a)更换

lua_rawset(luaState,LUA_REGISTRYINDEX);

9b)随着

lua_settable(luaState,-3);

现在一切都编译,但我得到内存访问冲突异常,这意味着我可能错误地替换了一些东西.任何帮助,将不胜感激.

解决方法

我相信我已经设法升级了这个,所以我将添加下面的内容和转换的详细信息.我在LUA低级API中创建了一个C包装器来导出我需要的功能

1a)替换

lua_settable(luaState,LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible

1b)随着

lua_settablereg(luaState);

2a)替换

lua_gettable(luaState,LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX no longer accessible

2b)随着

lua_gettablereg(luaState);

3a)替换

lua_pushvalue(luaState,LUA_GLOBALSINDEX);

3b)随着

lua_pushglobaltablefunction(luaState)

4a)替换

lua_replace(luaState,LUA_GLOBALSINDEX);

4b)随着

lua_popglobaltablefunction(luaState)

5a)替换

luaL_ref(luaState,(int)LuaIndexes.LUA_REGISTRYINDEX); // also luaL_unref

5b)随着

luaL_refreg(luaState); // also luaL_unrefreg

6a)替换

lua_rawgeti(luaState,reference);

6b)随着

lua_rawgetireg(luaState,reference);

7a)替换

lua_pcall(luaState,errfunc);

7b)随着

lua_pcalla(luaState,errfunc);

8a)替换

lua_getfield(luaState,Meta);

8b)随着

lua_getfieldreg(luaState,string Meta);

9a)替换

lua_rawset(luaState,LUA_REGISTRYINDEX);

9b)随着

lua_rawsetreg(luaState);

定义如下:

__declspec(dllexport) void lua_pushglobaltablefunction(lua_State *L) 
{
   lua_pushglobaltable(L);
}

__declspec(dllexport) void lua_popglobaltablefunction(lua_State *L) 
{
   lua_rawseti(L,LUA_RIDX_GLOBALS);
}

__declspec(dllexport) int luaL_regref(lua_State *L) 
{
   return luaL_ref(L,LUA_REGISTRYINDEX);
}

__declspec(dllexport) void luaL_unregref(lua_State *L,int reference)
{
   luaL_unref(L,reference);
}

__declspec(dllexport) void lua_settablereg(lua_State *L)
{
   lua_settable(L,LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_gettablereg(lua_State *L)
{
   lua_gettable(L,LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_rawsetreg(lua_State *L)
{
   lua_rawset(L,LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_rawgetreg(lua_State *L)
{
   lua_rawget(L,LUA_REGISTRYINDEX);
}

__declspec(dllexport) void lua_rawgetireg(lua_State *L,int reference)
{
   lua_rawgeti(L,reference);
}

__declspec(dllexport) void lua_getfieldreg(lua_State *L,const char *fieldname)
{
   lua_getfield(L,fieldname);
}

__declspec(dllexport) int luaL_loadbuffername(lua_State *L,const char *buff,int size,const char * name)
{
   return luaL_loadbuffer(L,buff,size,name);
}

__declspec(dllexport) double lua_tonum(lua_State *L,int index)
{
   return lua_tonumber(L,index);
}

__declspec(dllexport) int lua_pcalla(lua_State *L,int errfunc)
{
   return lua_pcall(L,errfunc);
}

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...