找回密码
 立即注册
查看: 211|回复: 0

zhuanlan.zhihu.com

[复制链接]
发表于 2024-7-15 17:44 | 显示全部楼层 |阅读模式
一、为什么Lua可以与C类语言进行交互

    Lua是一个嵌入式语言, 意味着Lua不仅可以是一个独立运行的法式包,也可以是一个用来嵌入其他应用的法式库。如果Lua不只是独立的法式,为什么到目前为止我们都在使用Lua独立法式呢?这个问题的答案在于Lua解释器(可执行的Lua)。Lua解释器是一个使用Lua尺度库实现的独立的解释器,他是一个很小的应用(总共不超过500行代码)。解释器负责法式和使用者的接口即从使用者那里获取文件或者字符串并传给Lua尺度库,Lua尺度库实现最终的代码运行,所以Lua可以作为法式库用来扩展应用的功能,也就是Lua可以作为扩展性语言的原因地址。Lua法式中可以注册有其他语言实现的函数, 这些函数可能由C语言(或者其他语言)实现,可以增加一些不容易由Lua实现的功能。
二、C#与Lua的交互过程:


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

  • Lua调用C#:
1、Wrap方式:首先生成C#源文件对应的Wrap文件, 由Lua文件调用Wrap文件,再由Wrap文件调用C#文件。
2、反射方式:当索引系统API、dll或者第三方库时,如果无法将代码的具体实现进行代码生成,可采用此方式实现交互。错误谬误:执行效率低。
三、C#与Lua的交互道理

    道理:Lua用一个抽象的栈在Lua和C#之间交换值。栈中的每一笔记录都可以保留任何Lua值无论你何时想从Lua请求一个值(比如一个全局变量的值),调用Lua,被请求的值将会被压入栈。无论你何时想要传递一个值给Lua,首先将这个值压入栈,然后调用Lua,这个值将会被弹出。

  • C#调用Lua
由C#先将数据放入栈顶,由Lua从栈顶取出该数据,而且再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#了。
参考文献:
1、Lua中文教程
2、C#与Lua交互过程及道理_钢与铁的博客-CSDN博客_lua和c#如何交互
3、Tolua框架下C#与Lua互调的基本代码:ToLua框架下C#与Lua代码的互调
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 09:45 , Processed in 0.099240 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表