ULua反射原理——自我理解,有问题请斧正,谢谢!

本文探讨了ULua的旧版本和现版本的反射实现方式,旧版本依赖C#反射,现版本通过Wrap类提升效率。wrap是C#类的包装,允许Lua通过调用Wrap间接操作C#实例。同时介绍了处理不想wrap的文件的方法,如使用tolua#的preloading和静态反射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(今天在研究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#类,完成调用过程。
具体可参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值