Administrator
发布于 2024-07-22 / 9 阅读
0
0

C#与XLua交互原理

C#与XLua交互原理 - 知乎 (zhihu.com)

深入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 虚拟栈从中取出调用结果


评论