.net core中加载lua脚本的类库: MoonSharp
前言
MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单;
源码:https://github.com/xanathar/moonsharp
nuget:PM> Install-Package MoonSharp
使用
加载脚本
- string scriptCode = @"
- sum = 0
- for i = 1, 100 do
- sum = sum + i
- end
- return sum";
- DynValue res = Script.RunString(scriptCode); //运行脚本
- Console.WriteLine(res.Number); //输出:5050
加载脚本文件:
- Console.WriteLine(Script.RunFile("luatest.txt").Number); //指定文件名加载脚本并运行
文件内容:
- sum =
- for i = , do
- sum = sum + i
- end
- return sum
传递数据(lua全局变量)
- string scriptCode = @"
- function fact (n)
- if (n == 0) then
- return 1
- else
- return n*fact(n - 1)
- end
- end
- return fact(num)";
- Script script = new Script();
- script.Globals["num"] = ; //对脚本中的全局变量 num 赋值
- Console.WriteLine(script.DoString(scriptCode).Number); //输出:120
lua函数的定义与调用
- Script script = new Script();
- //先加载定义的函数
- script.DoString(@"
- function fact(n)
- if (n == 0) then
- return 1
- else
- return n * fact(n - 1)
- end
- end
- ");
- //如果该函数会重复利用的,那么就应该这么调用,而不是每次都调用DoString加载脚本调用(每次都加载脚本是费性能的)
- Console.WriteLine(script.Call(script.Globals["fact"], ).Number); //输出:120
- Console.WriteLine(script.Call(script.Globals["fact"], DynValue.NewNumber()).Number); //和上面的一样
传递集合参数
- Script script = new Script();
- script.DoString(@"
- function sum(list)
- local total = 0;
- for i,v in ipairs(list) do
- total = total + v;
- end
- return total;
- end
- ");
- Console.WriteLine(script.Call(script.Globals["sum"], new List<int>() { , , , , })); //输出:25
多值返回:Tuple
- Script script = new Script();
- script.DoString(@"
- function sum(kv)
- local total = 0;
- local ks = '';
- for k,v in pairs(kv) do
- total = total + v;
- ks = ks .. k .. ','; --字符串拼接
- end
- return ks, total; --多值返回:Tuple
- end
- ");
- var dict = new Dictionary<string, int>() //传递字典
- {
- { "k1", },
- { "k2", },
- { "k3", },
- };
- var tp = script.Call(script.Globals["sum"], dict).Tuple; //返回tuple类型
- Console.WriteLine(tp[].String); //输出:k1,k2,k3,
- Console.WriteLine(tp[].Number); //输出:0, 如果是String类型的调用Number会输出:0
- Console.WriteLine(tp[].Number); //输出:6
lua脚本中加载和调用C#代码定义的函数
- public static void CallList()
- {
- Script script = new Script();
- script.Globals["getlist"] = (Func<List<int>, List<int>>)GetList; //加载C#中定义的函数
- script.DoString(@"
- function sum(list)
- local total = 0;
- for i,v in ipairs(list) do
- total = total + v;
- end
- return total;
- end
- ");
- string scode = @"return sum(getlist( { 11, 12, 13, 14, 15 } ))"; //脚本中调用C#中定义的函数
- Console.WriteLine(script.DoString(scode)); //输出:120
- }
- private static List<int> GetList(List<int> list)
- {
- for (int i = ; i <= ; i++)
- list.Add(i);
- return list;
- }
.net core中加载lua脚本的类库: MoonSharp的更多相关文章
- html网页中加载js脚本 下载下来是乱码(文件编码格式)
问题描述: 在一个index.html网页中,引入了jquery脚本,但是却出现错误,提示$ is not defined <!DOCTYPE html> <html lang=&q ...
- StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改
前言 使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey&qu ...
- unreal3对象属性自动从配置文件中加载的机制
unrealscript中有两个与属性自动配置相关的关键字: config/globalconfig 当把它们应用于属性时,对象在创建后,该属性的初始值会被自动设置为相对应ini文件中的值. 举例来说 ...
- 在Spring中使用Redis Lua脚本批量删除缓存
背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...
- 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...
- 使用jQuery加载script脚本
原文链接: Loading Scripts with jQuery JavaScript loaders加载器简单强大而又非常有用.我在博客上介绍过其中一些,例如 curljs 和 LABjs ,也 ...
- 动态加载JS脚本
建立dynamic.js文件,表示动态加载的js文件,里面的内容为: function dynamicJS() { alert("加载完毕"); } 如下方法中的html页面和dy ...
- 实用技巧:使用 jQuery 异步加载 JavaScript 脚本
JavaScript 加载器在 Web 开发中是非常强大和有用的工具.目前流行的几个加载器,像 curljs.LABjs 和 RequireJS 使用都很广泛.他们功能强大的,但有些情况下可以有更简单 ...
- 动态加载JS脚本的4种方法
实现OPOA(One Page One Application)时,必须使用动态加载js. 也就是在用户选择某个菜单项后,再动态加载对应的全部js到客户端. 动态加载js的情况很多啊,比如解决ajax ...
随机推荐
- 用Quick Cocos2dx做一个连连看(三)
做个日记吧. 最近比较忙,斗志也不高,昨天有点时间了,开始做了一下连接方法,一开始用的搜索算法,但是bug比较多,究其原因是对语法和算法都不是很熟悉. 然后昨天下午利用点时间用稍微通俗一点的连接算法, ...
- 基于Keepalvied的Mysql主主漂移(切换)
Keepalived实现原理:Keepalived详细介绍简介 实验环境 Master1.Amoeba--IP:192.168.1.5 Master2---IP:192.168.1.10 同时安装ke ...
- (中等) POJ 2886 Who Gets the Most Candies? , 反素数+线段树。
Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...
- ISP和IAP
ISP(在系统编程)是一种不依赖于单片机自身软件的程序下载方式,特点是不需要从电路板上取下单片机,通过某种方式使单片机进入ISP模式,开放编程接口,由其使用的计算机将新的程序代码写入到存储器内.我们平 ...
- 流水线技术原理和Verilog HDL实现(转)
源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...
- js中,怎么解决cookie里面中文乱码问题
呵呵,我查了百度和谷歌,都没找到解决方案,但是,最终直接结合两个函数就可以了,哈哈哈,开心ing function getCookie(name) { var prefix = name + &quo ...
- iOS开发——判断邮箱格式
//判断邮箱格式 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@ ...
- LPC2478的硬件IIC使用
LPC2478的IIC使用 LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示, 简单 ...
- @synthesize和@dynamic
@synthesize 除非开发人员已经做了,否则由编译器自动生成getter/setter方法.当开发人员自定义存或取方法时,自定义会屏蔽自动生成该方法. @dynamic 告诉编译器,不自动生成g ...
- HDU 3501 Calculation 2 ——Dirichlet积
[题目分析] 卷积太有趣了. 最终得出结论,互质数和为n*phi(n)/2即可. 计算(n*(n+1)/2-n-n*phi(n)/2)%md,用反正法即可证明. [代码] #include <c ...