发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
( 使用 C# 来扩展 Lua 功能 // extending Lua with C# )
目前的示例程序是使用 FFI 库来实现的 从 Lua 调用 C# 函数。 FFI 因为用到了反射机制来调用 C# 函数,性能会比较低。 应该尽量避免使用,如果没有找到更好的办法,准备之后把这个FFI实现废弃掉。 其实直接用 C# 实现一个库的形式,来让 lua 调用这种传统的做法效率会比较高,也是推荐采用的方式。而且也并不会麻烦太多。
比如我现在要实现一个叫 libfoo 的库, 里面提供两个方法: add(a, b) 和 sub(a, b)
库的实现
using UniLua; public static class LibFoo { public const string LIB_NAME = "libfoo.cs"; // 库的名称, 可以是任意字符串 public static int OpenLib(ILuaState lua) // 库的初始化函数 { var define = new NameFuncPair[] { new NameFuncPair("add", Add), new NameFuncPair("sub", Sub), }; lua.L_NewLib(define); return 1; } public static int Add(ILuaState lua) { var a = lua.L_CheckNumber( 1 ); // 第一个参数 var b = lua.L_CheckNumber( 2 ); // 第二个参数 var c = a + b; // 执行加法操作 lua.PushNumber( c ); // 将返回值入栈 return 1; // 有一个返回值 } public static int Sub(ILuaState lua) { var a = lua.L_CheckNumber( 1 ); // 第一个参数 var b = lua.L_CheckNumber( 2 ); // 第二个参数 var c = a - b; // 执行减法操作 lua.PushNumber( c ); // 将返回值入栈 return 1; // 有一个返回值 } }
库的初始化
// 创建 Lua 虚拟机 var Lua = LuaAPI.NewState(); // 加载基本库 Lua.L_OpenLibs(); Lua.L_RequireF( LibFoo.LIB_NAME // 库的名字 , LibFoo.OpenLib // 库的初始化函数 , false // 不默认放到全局命名空间 (在需要的地方用require获取) );
库的使用 (在 lua 代码中)
// 获取库 local libfoo = require "libfoo.cs" // 调用库的方法 print(libfoo.add(42, 1)) print(libfoo.sub(42, 22))
来自: quasiceo > 《待分类1》
0条评论
发表
请遵守用户 评论公约
Step By Step(Lua调用C函数)(转)
Step By Step(Lua调用C函数)(转)对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L)。需要说明的是,C函数无法直接将真正的返回值返回给Lua...
C++ 库支持 | Android NDK | Android Developers
C++ 库支持 | Android NDK | Android DevelopersC++ 库支持。C++ 异常和 RTTI.NDK 为 libc++ 提供了预建的静态和共享库,但您也可以在构建之前将以下行添加到 Application.mk ...
Lenky个人站点 ? 函数导出可视问题
lenky@lenky-virtual-machine:~/work$ gcc test.c -o test -lbar -lfoolenky@lenky-virtual-machine:~/work$ ./testfoo-11:21bar-22:22.}lenky@lenky-virtual-machine:~/work$ gcc -shared -fPIC -o li...
Linux操作系统中库的版本控制机制
Linux操作系统中库的版本控制机制。有些linux下的库不遵守这种规则,例如C语言库的glibc的基本c语言库:libc-x.y.z.so,glibc中的动态链接器:ld-x.y.z.so;比如存在库/lib/lib*.so.x.y.z,那么在/lib...
第十一章 : 更新静态库
第十一章 : 更新静态库第十一章:使用make更新静态库文件。这个特殊的规则被用来更新目标"A(M)",规则将文件"M"拷贝到库"A"中,如果之前在静态库文件"A"不存...
Linux平台静态库、动态库的一些笔记
Linux平台静态库、动态库的一些笔记。比如使用静态库生成的是foo,不同的生成方法得到的可执行文件可能会是foo-a、foo-b……,而使用动态库生成的是foobar,可能会是foobar-a、foobar-b……,等等。我...
Lua中的变量与赋值方法
Lua中的变量与赋值方法。test.lua.-- 第一个lua脚本。--定义变量的末尾不加分号;也是可以的,个人建议,因为Lua是C写的,写分号还是规范点。return num1+num2 ;--实现一个可传参的sub函数。--Lua的赋值...
Unity动态(Runtime)加载脚本
Unity动态(Runtime)加载脚本之前在群里跟人谈到脚本更新问题,于是就突然发现因为U3D对资源进行了打包,所以很难更新资源。后来看到有人说可以动态加载脚本,于是就去研究了。[csharp] view plaincopy ...
lua string 库
lua string 库 --lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……。string.sub("abcd",2)string.sub("abcd",-2)string.sub("abcd",2,-2)string.find("cd...
微信扫码,在手机上查看选中内容