ulua,slua的实现原理

####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代码写法

相关文章
相关标签/搜索