C#与Lua进行交互主要通过虚拟栈实现,栈的索引有两套机制,分为正数与负数,如果索引为正数,则1表示栈底,如果索引为负数,则-1表示栈顶。

C#调用Lua

  1. 过程:
    1. 由C#文件先调用Lua解析器底层DLL库(由C语言编写),再由DLL文件执行相应的Lua文件
    2. 由C#生成Bridge文件,Bridge调DLL文件,先调用Lua中DLL文件,由DLL文件执行DLL代码
  2. 实质:C#把请求或数据放在栈顶,然后Lua从栈顶取出该数据,在Lua中做出相应处理(查询,改变),然后把处理结果放回栈顶,最后C#再从栈顶取出Lua处理完的数据,完成交互。
  3. C#->Bridge->DLL->Lua OR C#->DLL->Lua

Lua调用C#

Wrap方式(静态生成代码)

  1. 过程:首先C#源文件对应的Wrap(中间文件/适配文件)文件,Wrap文件把字段方法,注册到Lua虚拟机中(解释器Luajit),然后Lua通过Wrap就可以调C#了
  2. 实质:Lua把请求或数据放在栈顶,然后C#从栈顶取出数据,在C#中做出相应处理(查询,改变),然后把处理结果放回栈顶,最后Lua再从栈顶取出C#处理完的数据,完成交互。
  3. Lua->Wrap->C#
  4. 可能产生的问题:
    1. 生成有宏定义的方法,如Editor会有问题
    2. 生成的代码,尤其使用il2cpp,会增大编译后的代码大小相应地增加包体大小,

反射方式

  1. 当索引系统中的API、DLL库或者第三方库时,如果无法将代码的具体实现进行代码生成,可采用此方式实现交互,执行效率低,所以一般使用Wrap方式调用C#。
  2. 可能产生的问题:
    1. 拆装箱开销
    2. stripping引用的反射失效
    3. 泛型方法,触发JIT,引起IOS异常
    4. 失去静态检查好处

参考资料

如何实现两门语言互相调用

Lua与其他宿主语言交互原理剖析

C# 与 Lua 交互(XLua 机制)

C#与Lua交互过程及原理

【ToLua】C#和Lua的交互细节

LUA TABLE实现原理(5.3源码)

散列·开放定址法