wordpress网站是什么意思,装修公司哪家产品好,该网站是恶意网站,网站建设代码流程Lua 与C#交互
前提
Lua是一种嵌入式脚本语言#xff0c;Lua的解释器是用C编写的#xff0c;因此可以方便的与C/C进行相互调用。轻量级 Lua语言的官方版本只包括一个精简的核心和最基本的库#xff0c;这使得Lua体积小、启动速度快#xff0c;也适合嵌入在别的程序里。
交…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交互原理研究