以前每一次研究一些新知识并且有所收获的时候,都想写一篇博客来分享这种自己的收获。 一直没有写主要是因为自己水平太菜了,怕写出来贻笑大方,最近想通了,想写就写下来,就算对别人毫无用处,还可以自己没事翻翻,省得自己都忘了。当然如果能对你有一丝丝的帮助,那真是再好不过了 。本文将针对C#与Lua的调用原理阐述一些个人的心得 。
Lua开发环境搭建
有关于VS && Lua开发环境的搭建网上有很多例子 ,笔者参考 http://www.byjth.com/lua/33.html (补充一点:Lua库文件尽量自己编译)
想知道C#如何与Lua进行交互 首先必须先了解C如何与Lua进行交互 ,C 和 Lua语言之间存在的差异,第一种是Lua使用了垃圾回收机制 ,而C语言需要显式的释放内存。第二种C语言是静态类型(在编译时可以确定变量类型,像int x这种),Lua是动态类型(编译时无法确定变量类型,不用注明变量类型)。为了解决这些问题 ,C与Lua的通信引入了虚拟栈结构。
头文件
在完成环境的搭建之后,已经可以开始编写测试代码了,首先引入lua.hpp头文件,lua.hpp头文件内容如下 :
lua.h:定义了Lua提供的基础函数,包括创建Lua环境 调用Lua函数、读写Lua环境的全局变量、注册Lua调用的新函数等 Lua.h定义的内容都有Lua_作为前缀
lualib.h:是一个辅助函数库,从lua.h的API中编写出的较高的抽象层,用于提供具体的功能(如luaL_dofile等) 它的所有定义都是luaL_作为前缀
luaxlib.h:定义了打开标准库的函数,。为了使Lua保持灵活,小巧,所有的标准库都被组织到了不同的包中。当我们需要使用哪个标准库时,就可以调用lualib.h中定义的函数来打开对应的标准库;而辅助函数luaL_openlibs则可以打开所有的标准库
C调用Lua
介绍完头文件之后,咱们写一个简单的main.cpp,如下图所示
#include <lua.hpp>
#include <iostream>
int main()
{
//Lua库中没有定义任何全局变量。它将所有的状态都保存在动态结构lua_State中,所有的C API都要求传入一个指向该结构的指针。
// luaL_newstate函数用于创建一个新环境或状态,也就是所谓的lua虚拟机对象。
lua_State* L = luaL_newstate();
//将hello world 压入虚拟栈
lua_pushstring(L, "hello world");
//将整数10压入虚拟栈
lua_pushnumber(L, 10);
if (lua_isnumber(L, -1) && lua_isstring(L, -2))
{
//虚拟栈对应位置的元素转换为对应类型
int num = lua_tonumber(L, -1);
const char* str = lua_tostring(L, -2);
lua_pop(L,2); // 出栈两个元素
printf("%d %s \n", num, str);
}
lua_close(L);
system("pause");
return 0;
}
print:10 Hello world
针对上面这个例子的API注释得已经很清楚了,现在我们来画图对