u3d插件xLua[四]Lua访问C#源码分析,反射,生成代码
本文将致力于研究xLua中Lua访问C#源码分析反射生成代码的用法要理解xLua的源码其实挺难的需要的必备知识比较多C#、Lua、反射、LuaC API一.前言从官网faq中的信息可以得出lua和C#的交互技术有生成代码和反射两种方式官方没有对此作详细的解释。本文致力于从源码上分析梳理展开这部分技术。参考faq.md参考xlua源码分析六 C#与lua的交互总结回顾u3d插件xLua[一]环境搭建和Tutorial分析来看这个demoC#侧的类DerivedClass可以在Lua中当成table来使用CS.Tutorial.DerivedClass。这个实现不是理所当然的有大量代码在对其进行实现下文将探索幕后的内容。二.Demo来看一个Demo所有脚本改动的内容都有对比见下图。Demo展示的内容是通过DoString执行Lua代码时lua中访问C#时(比如下面的local a,local b local c)是执行了C#代码的local a CS.UnityEngine.Vector3 local b CS.UnityEngine.Vector3.up local c CS.UnityEngine.Time.deltaTime打开场景U3DScriptingLuaTestScript.lua.txtLuaBehaviour.csLuaEnv.csObjectTranslator.cs运行打印在Console中的打印可以看出在lua中首次访问类时(比如Vector3)会先走LuaEnv中的元方法function metatable:__index(key) print(***###, key) local fqn rawget(self,.fqn) fqn ((fqn and fqn .. .) or ) .. key然后从这行进入C#local obj import_type(fqn)一直执行到ObjectTranslator.TryDelayWrapLoader这个函数是本文的核心public bool TryDelayWrapLoader(RealStatePtr L, Type type)阅读这个方法可以得出其通过3种方式将C#类本身和类的成员注册到Lua后文将做进一步分析(知道大致逻辑即可无需精细研究)2.1.走CodeEmit类if (!DelegateBridge.Gen_Flag !type.IsEnum() !typeof(Delegate).IsAssignableFrom(type) Utils.IsPublic(type)) { UnityEngine.Debug.Log(TryDelayWrapLoader: type - CodeEmit); Type wrap ce.EmitTypeWrap(type); MethodInfo method wrap.GetMethod(__Register, BindingFlags.Static | BindingFlags.Public); method.Invoke(null, new object[] { L }); }2.2.走Utils.ReflectionWrap(反射)UnityEngine.Debug.Log(TryDelayWrapLoader: type - ReflectionWrap); Utils.ReflectionWrap(L, type, privateAccessibleFlags.Contains(type));2.3.走生成代码if (delayWrap.TryGetValue(type, out loader)) { // 有生成代码走 XxxWrap.__Register UnityEngine.Debug.Log(TryDelayWrapLoader: type - GenWrap.__Register); delayWrap.Remove(type); loader(L); }三.Lua访问C#方式一走CodeEmit类if (!DelegateBridge.Gen_Flag !type.IsEnum() !typeof(Delegate).IsAssignableFrom(type) Utils.IsPublic(type)) { Type wrap ce.EmitTypeWrap(type); MethodInfo method wrap.GetMethod(__Register, BindingFlags.Static | BindingFlags.Public); method.Invoke(null, new object[] { L }); }把这3行代码做的事放一起说在内存中生成*Wrap类然后将类中的成员挂到Lua的表/元表上从而支持Lua → C# 的调用。实现上主要在CodeEmit.EmitTypeWrap中其比较难于理解需要较多System.Reflection.Emit中API的掌握不然看不懂。这里先不展开等用到了再深入研究。public Type EmitTypeWrap(Type toBeWrap)参考生成动态方法和程序集四.Lua访问C#方式二走 Utils.ReflectionWrap(反射)Utils.ReflectionWrap(L, type, privateAccessibleFlags.Contains(type));public static void ReflectionWrap(RealStatePtr L, Type type, bool privateAccessible)static void makeReflectionWrap(RealStatePtr L, Type type, int cls_field, int cls_getter, int cls_setter, int obj_field, int obj_getter, int obj_setter, int obj_meta, out LuaCSFunction item_getter, out LuaCSFunction item_setter, BindingFlags access)ReflectionWrap中通过反射将type的成员挂到lua侧类名这个表中核心实现在makeReflectionWrap中。通过调用LuaAPI.lua_rawset会执行类似t[k] v的操作然后将键和值都从栈中弹出lua_rawset对栈顶附近的数据布局有严格的要求表 (Table)位于栈上的有效索引index处。键 (Key)位于栈顶下方-2位置。值 (Value)位于栈顶-1位置。五.Lua访问C#方式三走生成代码5.1.收集通过GetGenConfig扫一遍当前域里几乎所有类型把配置合并进几个静态列表在MergeCfg中会收集特性LuaCallCSharpAttribute5.2.生成由Generator.GenOne完成写入文件由genCode保存文件文本内容下图是为Vector2类生成UnityEngine_Vector2Wrap.cs的过程5.3.运行第一次Lua访问C#类中成员时由Wrap文件调用RegisterFunc注册来看一个例子LuaTestScript.lua.txtfunction start() print(lua start...) local d CS.XLuaTest.NoGc.a1 end从调用堆栈可以看出调用链为LuaBehaviour.Start-LuaTestScript.Start-...-XLuaTestNoGcWrap.__Register-Utils.RegisterFunc进行注册

相关新闻

AI能力分层时代来临:从Claude Fable 5事件看大模型专业化趋势

AI能力分层时代来临:从Claude Fable 5事件看大模型专业化趋势

1. 项目概述:一次标志性事件的深度复盘最近,AI圈子里一个代号为“Claude Fable 5”或“Mythos 5”的内部事件,引发了远超其代码名称的关注。这并非一次简单的模型版本泄露或功能更新,而是被许多资深从业者视为一个关键的转折点信号…

2026/8/12 18:44:34 阅读更多 →
数学建模竞赛助攻包:AI工具与高频模型实战指南

数学建模竞赛助攻包:AI工具与高频模型实战指南

这次我们来看一个面向2026年全国大学生数学建模竞赛的综合性辅助资源。这个项目不是单一的软件或模型,而是一个整合了选题策略、高频模型、AI工具教程、获奖技巧和写作模板的“助攻包”,目标很直接:帮助零基础或基础薄弱的学生在短时间内&…

2026/8/12 18:44:34 阅读更多 →
AI编程评估新基准:打破唯分数论,从Harness独立性看模型工程鲁棒性

AI编程评估新基准:打破唯分数论,从Harness独立性看模型工程鲁棒性

1. 项目概述:为什么我们需要一个新的基准?最近在AI编程领域,一个名为“SWE-bench”的基准测试火了。简单来说,它就像给AI程序员(比如GPT-4、Claude等大模型)举办的一场“编程奥林匹克”,让它们去…

2026/8/12 18:44:34 阅读更多 →

最新新闻

2026口碑筛选生活总结视频推荐 | 实用创作制作选择建议

2026口碑筛选生活总结视频推荐 | 实用创作制作选择建议

2026经口碑筛选整理,生活总结视频创作的音素材处理工具可按转写需求适配选择,核心推荐基于公开口碑和场景适配整理。适合需要高效处理音视频素材、关注转写速度和准确率的内容创作者。前提是仅覆盖音素材转写整理环节,不适合需要一站式完成视…

2026/8/12 19:23:00 阅读更多 →
asp.net网站建设项目实战资料:从入门到精通的全方位避坑指南

asp.net网站建设项目实战资料:从入门到精通的全方位避坑指南

在IT行业的江湖里,流传着这样一句话:“前端卷样式,后端卷逻辑,而.NET卷的是生态和架构。”对于许多初出茅庐的开发者,或者是那些想要从传统Java、PHP阵营转型的工程师来说,Asp.net无疑是一座既熟悉又陌生高山。熟悉是因为微软的文档做得太好了,陌生是因为当那些精美的官…

2026/8/12 19:23:00 阅读更多 →
PKC 第 086 个开关:清空聊天记录的位置、验证方法与风险边界

PKC 第 086 个开关:清空聊天记录的位置、验证方法与风险边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/12 19:23:00 阅读更多 →
四大音乐平台统一API:如何用一套代码解决多平台音乐资源获取难题

四大音乐平台统一API:如何用一套代码解决多平台音乐资源获取难题

四大音乐平台统一API:如何用一套代码解决多平台音乐资源获取难题 【免费下载链接】music-api Music API 项目地址: https://gitcode.com/gh_mirrors/mu/music-api 在当今数字音乐时代,开发者面临着一个棘手的挑战:不同音乐平台拥有各自…

2026/8/12 19:23:00 阅读更多 →
线路板曝光机如何决定PCB制造精度上限

线路板曝光机如何决定PCB制造精度上限

PCB制造行业的人都知道,线路图形转移是品质把控的核心关卡。而完成图形转移的关键设备,正是常被忽视的线路板曝光机。很多工厂在曝光环节投入不足,导致良率长期卡在瓶颈期,却始终找不到问题根源。 这背后的逻辑并不复杂&#xff1…

2026/8/12 19:23:00 阅读更多 →
深入解析Cursor Free VIP:如何绕过Cursor AI的试用限制实现Pro功能永久使用

深入解析Cursor Free VIP:如何绕过Cursor AI的试用限制实现Pro功能永久使用

深入解析Cursor Free VIP:如何绕过Cursor AI的试用限制实现Pro功能永久使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Yo…

2026/8/12 19:21:59 阅读更多 →

日新闻

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

Ubuntu 22.04安装与使用tree命令:高效管理Linux目录结构

1. 为什么需要一个“目录树”工具?在Linux世界里,尤其是Ubuntu这样的发行版,命令行是很多人的主战场。我们每天都要和文件、目录打交道。ls命令是查看目录内容的首选,它简洁、高效,能列出文件名、权限、大小等关键信息…

2026/8/12 9:33:34 阅读更多 →
博思AI智能体:意图识别、思考链与性能优化的工程实践

博思AI智能体:意图识别、思考链与性能优化的工程实践

在AI应用从“能用”走向“好用”的进程中,系统的响应速度、决策透明度与高并发稳定性是决定用户体验的关键。博思AI智能体近期完成了一次重要的专项优化,聚焦于意图识别、思考链展示与全链路压测三大核心领域,将系统从功能实现推向了工程卓越…

2026/8/12 9:33:34 阅读更多 →
子代理架构:AI智能体任务分解与协同执行的核心原理与实践

子代理架构:AI智能体任务分解与协同执行的核心原理与实践

1. 项目概述:为什么我们需要“子代理”?最近在折腾各种AI应用和自动化流程时,我越来越频繁地遇到一个瓶颈:单个AI智能体(Agent)的能力边界。无论是处理复杂的多步骤任务,还是需要同时调用多个专…

2026/8/12 9:33:34 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →