####0 ulua, slua 实现分红两个部分:c层和c#层c#
c层主要是lua或者luajit,加一个c层的接口,以及一些能够添加的第三方库闭包
c#层:主要解决:函数
如何调用lua代码lua
lua如何调用c#代码对象
c#对象如何传递给lua索引
lua对象如何传递给c#接口
这些问题。生命周期
####1调用lua代码资源
LuaDll 导入了lua相关的c接口,用于c#调用字符串
#####2lua调用c#方法
经过lua_pushcfunction 将c#函数转化为c函数,传递给lua代码,接着能够设置lua中table的某个成员对应于这个c函数, 这种方式,c#中的函数若是被gc了,会有问题。
lua_pushcfunction
lua_setglobal
上面能够简单的设定全局函数
#####3 c#对象传递给给lua代码
跨语言传递对象,最简单的方式,将对象序列化为字符串传递过去;
对于简单值对象,能够序列化方式传递;
复杂类对象,能够建立一个LuaTable,用于对应于c#中的类对象,将c#类的函数注册到table中,将对属性的访问和设置,注册get set 函数便可。
在c#层能够保存一个id到object的映射表,当须要从Lua调用c#对象的方法,只须要告知对象的id,接着在C#层根据id得到到对象便可
####4 Lua对象传递给c#
Lua对象包括简单的值对象,复杂的table对象。
值对象直接从堆栈上返回
table对象在c# LuaTable来表示,在lua中能够将lua的table存储起来,经过id进行索引,而将id传给 c#层,当c#层须要访问table数据,只须要根据id调用对应接口便可。
####5 静态绑定代码生成
当lua中须要调用c#中某个类的接口的时候,首先lua须要得到这个c#对象,接着调用c#对象函数接口;
Lua中得到某个c#对象,能够是经过c#的静态方法,或者成员方法。
简单的从静态方法开始考虑:
首先Lua中须要有该类的一个Table,这个table中的有静态方法的c函数能够供lua调用。
Lua的全局global table能够注册名字,这样在lua全局代码中就能够调用这个名字;
当调用某个方法返回c#对象,将c#对象放置到c#的列表中,而将对应的id返回给lua。
####6 对象生命周期管理
当Lua中引用c#对象,如何当lua引用结束的时候,通知c#中的管理代码,来去除对象?
当c#引用lua对象,如何管理Lua对象的生命周期呢?
Lua table能够添加一个metatable用于重载lua系统默认的一些接口的操做,重载__gc 接口,能够再lua 回收资源时候,调用c#代码进行清理工做,这样当lua不须要c#对象的时候,能够将对象回收。
c#引用luatable对象,如何释放掉?c#对象能够实现 IDisposable 接口,当C#对象被GC的时候,释放对lua对象的引用。
经过 luaL_ref luaL_unref, 即将 table中对应id的项状况。
####7 异常处理
当lua调用c#代码发生异常,在c#代码中添加了异常捕获,当出现异常将向堆栈压入false以及异常信息,而若是没有异常,将压入true,以及正常的返回值;
而在压入c#函数到lua中时候,压入一个闭包,而在lua的这个闭包调用正常的csharp函数,检查返回是否有异常,存在异常,则抛出一个lua_error,或者用lua的 assert抛出一个异常
当c#调用lua代码发生异常,c#能够使用lua_pcall 来执行lua代码,能够传入相应的异常处理函数,来打印出lua的异常以及堆栈信息。
####6 一种基于Component 提供接口的Lua代码写法