当前位置: 首页 > news >正文

Lua 与 C#交互

Lua 与C#交互

前提

Lua是一种嵌入式脚本语言,Lua的解释器是用C编写的,因此可以方便的与C/C++进行相互调用。轻量级 Lua语言的官方版本只包括一个精简的核心和最基本的库,这使得Lua体积小、启动速度快,也适合嵌入在别的程序里。

交互过程

  • C#调用Lua:

由C#文件调用Lua解析器底层dll库(由C语言编写),再由dll文件执行相应的Lua文件。

  • Lua调用C#:

1、Wrap方式:首先生成C#源文件对应的Wrap文件, 由Lua文件调用Wrap文件,再由Wrap文件调用C#文件。

2、反射方式:当索引系统API、dll或者第三方库时,如果无法将代码的具体实现进行代码生成,可采用此方式实现交互。缺点:执行效率低。

交互原理

主要通过Lua虚拟栈实现,所有类型的数据交换都通过虚拟栈完成

Lua 提供了两种索引方式操作虚拟栈,

正数索引:1 表示栈底

负数索引:-1 表示栈顶

操作流程

  • C#调用Lua

由C#先将数据放入栈顶,由Lua从栈顶取出该数据并做出相应的处理, 然后返回对应的值到栈顶,最后再从C#从栈顶取出Lua处理完的数据,完成交互。

  • Lua调用C#

先生成C#源文件所对应的Wrap文件(使用反射)或者编写C#源文件所对应的C模块,然后将源文件内容通过Wrap文件或者C模块注册到Lua解释器中,然后由Lua去调用。

代码流程

  • C#调用Lua:

C#生成Bridge文件,Bridge调用dll文件(dll是C写的库),先调用Lua中的dll文件,再由dll文件执行Lua代码。

C# -> Bridge -> dll -> Lua / C# -> dll -> Lua

  • Lua调用C#:

先生成Wrap文件(中间文件/配置文件),wrap文件把字段方法注册到lua虚拟机中(解释器luajit),然后Lua通过wrap就可以调C#了。

Lua -> wrap -> C#

垃圾回收

C# 和 Lua 都有各自的垃圾回收机制,为了避免冲突,当使用了对方代理对象时,代理对象会被缓存,并在 真实对象 被回收后,移除缓存,使 代理对象 也能被回收

Lua 传递至 C# 的对象,会通过 LuaAPI.luaL_ref 保持引用而不被回收,C# 这边对象被回收后,将其从 LUA_REGISTRYINDEX 表中移除,使其可以被 Lua 垃圾管理器回收

C#传递至Lua的对象,会在Lua注册为元表,生成原表数据时会将相关对象的被Lua回收的回调也注册到其中,当对象在Lua回收后,会将对象压栈,然后回调到C#。C#根据回调传递的Lua状态机指针,通过正数索引在Lua虚拟栈中获取对象索引并将其从缓存列表中移除,后续通过垃圾回收器进行回收。

参考资料

C#与Lua交互过程及原理

C#与Lua交互过程及原理

C语言和Lua之间交互的原理

CS与XLua交互原理研究

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 通过域名无法访问不到网站,IP可正常访问(DNS污染)
  • 01 Docker概念和部署
  • 计算机网络基础概念 交换机、路由器、网关、TBOX
  • 大数据之Flink(二)
  • 基于SpringBoot+Vue+MySQL的滑雪场管理系统
  • vscode配置django环境并创建django项目
  • 基于单片机的电子药箱控制系统设计
  • 百度视频排名代发(百度视频秒收录代发)
  • 基于Spring Boot开发一个自习室预定系统
  • 故障恢复(残次版)
  • 如何分析建筑资质加盟呢?
  • restic解说
  • 函数的定义
  • 从零开始,认识游戏设计师(5)体验发生于场景①
  • python-新冠病毒
  • 345-反转字符串中的元音字母
  • chrome扩展demo1-小时钟
  • HTTP中GET与POST的区别 99%的错误认识
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript函数式编程(一)
  • nginx 负载服务器优化
  • Tornado学习笔记(1)
  • WebSocket使用
  • 如何设计一个微型分布式架构?
  • 我感觉这是史上最牛的防sql注入方法类
  • 智能合约Solidity教程-事件和日志(一)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云ACE认证之理解CDN技术
  • ​flutter 代码混淆
  • ​iOS实时查看App运行日志
  • #{}和${}的区别是什么 -- java面试
  • #QT项目实战(天气预报)
  • (04)odoo视图操作
  • (12)Linux 常见的三种进程状态
  • (13)DroneCAN 适配器节点(一)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (C11) 泛型表达式
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (四)js前端开发中设计模式之工厂方法模式
  • **python多态
  • .equals()到底是什么意思?
  • .NET Micro Framework初体验(二)
  • .net 后台导出excel ,word
  • .Net中ListT 泛型转成DataTable、DataSet
  • .NET中两种OCR方式对比
  • .net中生成excel后调整宽度
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • [ C++ ] STL---string类的模拟实现
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [1204 寻找子串位置] 解题报告
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法