深入xLua实现原理之C#如何调用Lua - iwiniwin - 博客园 (cnblogs.com)
深入xLua实现原理之Lua如何调用C# - iwiniwin - 博客园 (cnblogs.com)
基本介绍
Lua 虚拟机由 C/C++ 实现,因此它可以直接与宿主进行通信
C# 则可以依靠 C API 通过 P/Invoke 方式调用 Lua 虚拟机函数
即 C# 可以借助 C/C++ 来与 Lua 进行数据通信
XLua 相关 P/Invoke 调用接口位于
LuaDLL.cs
文件
lua和c/c++的数据交互
基础:Lua提供的一个虚拟栈
两者所有类型的数据交换都通过这个栈完成
Lua 提供了两种索引方式操作虚拟栈
正数索引:1 表示栈底
反向索引:-1 表示栈顶
例如:
3 -1
2 -2
1 -3
Lua 调用 C/C++ 函数
将 C++ 的函数包装成可供 Lua 调用的格式
接收一个 Lua 状态机指针(
IntPtr
)的静态方法,该方法返回值为 int,表示方法返回值数量在 Lua 环境注册包装好的函数
Lua 调用
首先通过
lua_gettop
获取 Lua 参数数量(因为可能有重载)继续通过正数索引从
1
开始在 Lua 栈上获取具体参数值执行实际函数功能
将返回值压栈
包装函数的返回值为 int,表示返回值数量
C/C++ 调用 Lua 函数
使用
lua_getglobal(xlua_getglobal)
来获取函数,然后将其压入栈若函数有参则依次将函数的参数也压入栈
调用
lua_pcall
让虚拟机执行函数参数分别为:
虚拟机指针
参数个数
返回值个数
错误处理函数,0表示无,表示错误处理函数在栈中的索引
如果运行出错,
lua_pcall
会返回一个非零的结果若调用完毕没有出错,则可以通过 Lua 虚拟栈从中取出调用结果