当前位置: 首页 > 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交互原理研究

http://www.lryc.cn/news/435500.html

相关文章:

  • 【办公类】大组工会学习(文心一言+Python批量)
  • 项目管理工作流是什么?项目管理工作流管理实战技巧!
  • leveldb源码剖析(二)——LSM Tree
  • 三十六、Gin注册功能-检查账号是否存在
  • 什么是期权对冲?
  • 什么是数据库课程设计?
  • 走进低代码报表开发(二):高效报表设计新利器
  • 校园水电费管理|基于java的校园水电费管理小程序系统 (源码+数据库+文档)
  • java设计模式 桥接模式
  • 如何利用大数据技术来识别和预防网络赌博行为?
  • N-152基于java贪吃蛇游戏5
  • 从线段中搜寻提取闭合轮廓(三)
  • 最全面的递归算法详解,一篇足矣(高手必备)
  • 数据结构(2)单向链表排序和双向链表操作
  • OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用
  • Mysql基础练习题 1757.可回收且低脂的产品(力扣)
  • Nginx调优,有这篇就够了
  • Java语言程序设计基础篇_编程练习题*18.17 (数组中某个指定字符出现的次数)
  • 实时(按帧)处理的低通滤波C语言实现
  • Centos7.9部署Gitlab-ce-16.9
  • 卷积神经网络(一)
  • 加密与安全_ sm-crypto 国密算法sm2、sm3和sm4的Java库
  • VR 尺寸美学主观评价-解决方案-现场体验研讨会报名
  • 网络基础入门指南(三)
  • 大众萨克森:SNP助力汽车制造智能化,实现SAP S/4HANA系统成功升级
  • 20240912 每日AI必读资讯
  • Linux之Shell命令
  • 前端Vue框架实现html页面输出pdf(html2canvas,jspdf)
  • SAP Fiori UI5-环境搭建-2022-2024界面对比
  • 二百六十三、Java——IDEA项目打成jar包,然后在Linux中运行