lua和C#交互原理 刨根问底

  1. 热更新原理:
    就是C#可以和lua进行交互
    lua可以重写C#的函数

  2. lua和C#是怎么进行交互的?
    lua与其他语言交互,都是通过操作虚拟栈交流的。而操作虚拟栈最原始的方法就是通过lua与c语言的api
    那其它语言是怎么访问到这个虚拟栈 怎么能确保访问到的是同一个栈?
    可以为 一个lua文件单独开一个虚拟栈 不管你C#和Lua怎么交互
    交互的对象首先是一个文件 文件肯定是单独的
    lua调用C#:
    lua_pushstdcallcfunction(L, SayHello),将c#的方法SayHello进栈
    lua_setglobal(L, “AAA”),将栈顶元素设置成lua中的全局变量AAA,此时栈顶是function类型,即AAA=function () end
    luaL_dostring(L, “print(AAA(“123”))”),在lua中将参数123进栈
    lua_tostring(L, 1),在c#中将栈顶元素123转换为string用于操作,栈是这样的(从栈底到栈顶):123
    lua_pushstring(L, "Hello " + s),在c#中将返回值进栈,供lua使用,栈是这样的(从栈底到栈顶):123->Hello 123
    C#调用lua:
    lua_getglobal(L, “AddFunc”),将lua中的全局变量AddFunc进栈
    lua_pushnumber(L, x),将参数x进栈,当2个参数都进栈后,栈是这样的(从栈底到栈顶):AddFunc->8->9
    lua_call(L, 2, 1),调用后,栈的元素都出栈,然后返回值进栈,栈是这样的(从栈底到栈顶):17
    lua_tonumber(L, -1),将栈顶元素转换为number用于赋值
    lua_pop(L, 1),栈顶元素出栈,此时栈为空
    Lua调用C,我了解到的有3种方式
    1.通过在C中注册函数给lua调用
    2.封装成c动态链接库,在lua中require
    3.在LuaJIT里面可以使用ffi高性能的调用C(但是IOS上不支持LuaJIT。。)

  3. 不管是lua调用C# 还是C#调用lua都是
    一方把数据放到栈顶 另一方对数据进行操作 先把数据都出栈 把执行结果再放入栈 一方再去获取栈顶的数据

  4. C#是怎么把一个lua函数转成C#函数的?
    lua又是怎么把一个C#函数转成lua函数的
    函数的组成:1.名字 2.是否全局 3.是否传参 4.返回类型 5.内容执行
    任何类型的对象 都只是存在于数据类型之上的
    网上有一个中间转化的类型的dll

  5. lua是怎么访问到一个CS类的?
    1.CS:LuaEnv的init_xlua代码块里生成的全局表,核心init_xlua里的metatable:__index方法。

猜你喜欢

转载自blog.csdn.net/qq_43204246/article/details/113000675