ULua反射原理
(今天在研究ULua反射原理时搜索到的答案,进行的理解。如果后续确认有问题后会及时改正。)
所参考引用的文章 ulua、tolua原理解析
旧版本ULua
使用的类
System.Type类 :访问任何给定数据类型的信息。
System.Reflection.Assembly类 :用于访问给定程序集的信息,或者把这个程序集加载到程序中。
实现方式
lua调用C#是基于C#的反射。通过 System.Reflection.Assembly 把UnityEngine程序集加入到Lua代码中。然后通过 System.Type 查找出需要的类型加入到Lua代码中
private string script = @"
luanet.load_assembly('UnityEngine')
luanet.load_assembly('Assembly-CSharp')
GameObject = luanet.import_type('UnityEngine.GameObject')
ParticleSystem = luanet.import_type('UnityEngine.ParticleSystem')
local newGameObj = GameObject('NewObj')
newGameObj:AddComponent(luanet.ctype(ParticleSystem))
";
//反射调用
void Start () {
LuaState lua = new LuaState();
lua.DoString(script);
}
本质就是 在C#段写个通用反射函数, 然后将地址注册到lua全局表中
现版本的ulua(tolua)
实现方式
lua调用C#是基于去反射。
把所有的c#类的public成员变量、成员函数,都导出到一个相对应的Wrap类中,而这些成员函数通过特殊的标记,映射到lua的虚拟机中,当在lua中调用相对应的函数时候,直接调用映射进去的c# wrap函数,然后再调用到实际的c#类,完成调用过程。
具体可参考