xlua中C#调用Lua的table和function

开头

    上一篇 文章主要介绍了xlua热更新中生成代码的原理,以及Lua调用C#对象的原理。Lua调用c#对象可以用两种方式(生成代码和反射)实现同一种结果:生成userdate保存对象在c#侧的索引,为所有成员方法生成包裹,利用Lua中已存在的其与C/C++压栈方式的数据传递,进行参数和返回值的传递,实现对c#对象的控制。
    那么,在使用热更新时,需要用Lua函数重载C#函数,这时就需要c#能够调用到Lua。这篇文章粗粗介绍下其中的原理。不足之处,请各位多多指正。后续会加上代码和详细步骤解析。

正文

    上一节曾提到过Lua和C/C++的数据交互是通过栈进行的,进行数据传递的时候,把数据拷贝到栈上,并返回其索引值,就可以在另一边取到数据。而c#就可以借助这种方式,通过P/Invoke(非托管代码调用)方式调用Lua的dll,执行Lua的C API,来完成与lua的数据通信。

    我们先看一下Lua中的数据结构:string、bool、number、table、function。string、bool和number可以在C#侧找到对应的数据结构进行转换接收,function在c#中对应着委托,table没有对应的结构,xlua自己定义了一个LuaTable的类。在ObjectCasters.cs中,有xlua默认定义的转换函数。
ObjectCasters.cs

C#调用Lua table

    当给一个LuaTable(C#侧)对象赋值table(Lua侧)时,其lua代码相当于CS.XXX.luatable = { a=1 },首先在赋值时,lua这边会把参数{a=1}压入栈中,然后需要C#调用其生成的set包裹方法(见上一篇)进行设置。压入之后,c#这边就要先拿到这个table,需要先获取类型对应的转换器函数,将lua返回的栈索引取到table的引用,添加到Lua注册表中,然后LuaTable对象才能保存该索引。这个索引就是table(lua)在Lua注册表中的引用。LuaTable类中封装了Get方法,其原理也是通过压栈操作,获取类型对应的转换器函数,在栈上通过索引取到对应的独享,通过此方法就可以完整的访问table的内容了。

C#调用Lua function

</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值