C#与Lua交互原理

本文详细介绍了C#如何与Lua进行交互,从环境搭建到C调用Lua的原理,包括虚拟栈的概念和API使用。通过示例代码解析了C调用Lua函数的过程,并探讨了Lua调用C函数时的注册机制。最后提到了LuaFramework框架在C#与Lua交互中的作用。
摘要由CSDN通过智能技术生成

     以前每一次研究一些新知识并且有所收获的时候,都想写一篇博客来分享这种自己的收获。 一直没有写主要是因为自己水平太菜了,怕写出来贻笑大方,最近想通了,想写就写下来,就算对别人毫无用处,还可以自己没事翻翻,省得自己都忘了。当然如果能对你有一丝丝的帮助,那真是再好不过了 。本文将针对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注释得已经很清楚了,现在我们来画图对

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值