首先,感谢蒙哥让我能用上这么方便的一个lua框架-tolua
我想大家在使用tolua的时候,在做c#包装类(即wrap文件的时候),都会不由的感叹,原来lua和c#交互竟然那么简单,那么请问有谁真正的了解过这些wrap文件的原理,这些文件又是如何在虚拟机之中运行的呢,intptr这个类的作用又是什么,里面的topointer方法有没有想过之间隐藏的含义,那么我接下来会慢慢bb的。
阅读一下部分,请了解lua寄存器虚拟机的基础知识,不明白可以看我上一篇文章最前面部分关于lua虚拟机介绍,有了这个概念你才可以继续阅读
1.tolua如何将c#对象导入到lua里
tolua为每一个传入lua的对象建立一个userdata,userdata的值,是c#对象的地址。userdata的metatable,是一个tolua建立的,记录了userdata对应c#类型信息的表格,包括导出的成员变量、成员函数等信息。
对于成员变量的读取赋值,tolua是在metatable里新建了.get和.set两个表。两个表里分别存储了以变量名为键,以读取设置c #函数为值的表项。在metatable的__index和__newindex里,以变量名为键,从.get和.set表里取得读取设置函数并调用。
传入c#对象的tolua函数是tolua_pushusertype。一般情况下,第一次使用这个函数将一个c#对象push到lua堆 栈上时,才会新建userdata。tolua会以c#对象地址为键,userdata为值,将键值对存储在tolua_ubox表里。下次推入同 样的c#对象时,从这个表里取出userdata推入堆栈即可。