前言

MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单;

官网:http://www.moonsharp.org/

源码:https://github.com/xanathar/moonsharp

nuget:PM> Install-Package MoonSharp

使用

加载脚本

  1. string scriptCode = @"
  2. sum = 0
  3. for i = 1, 100 do
  4. sum = sum + i
  5. end
  6. return sum";
  7. DynValue res = Script.RunString(scriptCode); //运行脚本
  8. Console.WriteLine(res.Number); //输出:5050

加载脚本文件:

  1. Console.WriteLine(Script.RunFile("luatest.txt").Number); //指定文件名加载脚本并运行

文件内容:

  1. sum =
  2. for i = , do
  3. sum = sum + i
  4. end
  5. return sum

传递数据(lua全局变量)

  1. string scriptCode = @"
  2. function fact (n)
  3. if (n == 0) then
  4. return 1
  5. else
  6. return n*fact(n - 1)
  7. end
  8. end
  9. return fact(num)";
  10.  
  11. Script script = new Script();
  12. script.Globals["num"] = ; //对脚本中的全局变量 num 赋值
  13.  
  14. Console.WriteLine(script.DoString(scriptCode).Number); //输出:120

lua函数的定义与调用

  1. Script script = new Script();
  2. //先加载定义的函数
  3. script.DoString(@"
  4. function fact(n)
  5. if (n == 0) then
  6. return 1
  7. else
  8. return n * fact(n - 1)
  9. end
  10. end
  11. ");
  12.  
  13. //如果该函数会重复利用的,那么就应该这么调用,而不是每次都调用DoString加载脚本调用(每次都加载脚本是费性能的)
  14. Console.WriteLine(script.Call(script.Globals["fact"], ).Number); //输出:120
  15. Console.WriteLine(script.Call(script.Globals["fact"], DynValue.NewNumber()).Number); //和上面的一样
传递集合参数
  1. Script script = new Script();
  2. script.DoString(@"
  3. function sum(list)
  4. local total = 0;
  5. for i,v in ipairs(list) do
  6. total = total + v;
  7. end
  8. return total;
  9. end
  10. ");
  11.  
  12. Console.WriteLine(script.Call(script.Globals["sum"], new List<int>() { , , , , })); //输出:25
多值返回:Tuple
  1. Script script = new Script();
  2. script.DoString(@"
  3. function sum(kv)
  4. local total = 0;
  5. local ks = '';
  6. for k,v in pairs(kv) do
  7. total = total + v;
  8. ks = ks .. k .. ','; --字符串拼接
  9. end
  10. return ks, total; --多值返回:Tuple
  11. end
  12. ");
  13.  
  14. var dict = new Dictionary<string, int>() //传递字典
  15. {
  16. { "k1", },
  17. { "k2", },
  18. { "k3", },
  19. };
  20. var tp = script.Call(script.Globals["sum"], dict).Tuple; //返回tuple类型
  21. Console.WriteLine(tp[].String); //输出:k1,k2,k3,
  22. Console.WriteLine(tp[].Number); //输出:0, 如果是String类型的调用Number会输出:0
  23. Console.WriteLine(tp[].Number); //输出:6

lua脚本中加载和调用C#代码定义的函数

  1. public static void CallList()
  2. {
  3. Script script = new Script();
  4. script.Globals["getlist"] = (Func<List<int>, List<int>>)GetList; //加载C#中定义的函数
  5. script.DoString(@"
  6. function sum(list)
  7. local total = 0;
  8. for i,v in ipairs(list) do
  9. total = total + v;
  10. end
  11. return total;
  12. end
  13. ");
  14.  
  15. string scode = @"return sum(getlist( { 11, 12, 13, 14, 15 } ))"; //脚本中调用C#中定义的函数
  16. Console.WriteLine(script.DoString(scode)); //输出:120
  17.  
  18. }
  19.  
  20. private static List<int> GetList(List<int> list)
  21. {
  22. for (int i = ; i <= ; i++)
  23. list.Add(i);
  24. return list;
  25. }

.net core中加载lua脚本的类库: MoonSharp的更多相关文章

  1. html网页中加载js脚本 下载下来是乱码(文件编码格式)

    问题描述: 在一个index.html网页中,引入了jquery脚本,但是却出现错误,提示$ is not defined <!DOCTYPE html> <html lang=&q ...

  2. StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改

    前言 使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey&qu ...

  3. unreal3对象属性自动从配置文件中加载的机制

    unrealscript中有两个与属性自动配置相关的关键字: config/globalconfig 当把它们应用于属性时,对象在创建后,该属性的初始值会被自动设置为相对应ini文件中的值. 举例来说 ...

  4. 在Spring中使用Redis Lua脚本批量删除缓存

    背景 之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis ...

  5. 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密

    下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...

  6. 使用jQuery加载script脚本

    原文链接: Loading Scripts with jQuery JavaScript loaders加载器简单强大而又非常有用.我在博客上介绍过其中一些,例如 curljs  和 LABjs ,也 ...

  7. 动态加载JS脚本

    建立dynamic.js文件,表示动态加载的js文件,里面的内容为: function dynamicJS() { alert("加载完毕"); } 如下方法中的html页面和dy ...

  8. 实用技巧:使用 jQuery 异步加载 JavaScript 脚本

    JavaScript 加载器在 Web 开发中是非常强大和有用的工具.目前流行的几个加载器,像 curljs.LABjs 和 RequireJS 使用都很广泛.他们功能强大的,但有些情况下可以有更简单 ...

  9. 动态加载JS脚本的4种方法

    实现OPOA(One Page One Application)时,必须使用动态加载js. 也就是在用户选择某个菜单项后,再动态加载对应的全部js到客户端. 动态加载js的情况很多啊,比如解决ajax ...

随机推荐

  1. 用Quick Cocos2dx做一个连连看(三)

    做个日记吧. 最近比较忙,斗志也不高,昨天有点时间了,开始做了一下连接方法,一开始用的搜索算法,但是bug比较多,究其原因是对语法和算法都不是很熟悉. 然后昨天下午利用点时间用稍微通俗一点的连接算法, ...

  2. 基于Keepalvied的Mysql主主漂移(切换)

    Keepalived实现原理:Keepalived详细介绍简介 实验环境 Master1.Amoeba--IP:192.168.1.5 Master2---IP:192.168.1.10 同时安装ke ...

  3. (中等) 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 ...

  4. ISP和IAP

    ISP(在系统编程)是一种不依赖于单片机自身软件的程序下载方式,特点是不需要从电路板上取下单片机,通过某种方式使单片机进入ISP模式,开放编程接口,由其使用的计算机将新的程序代码写入到存储器内.我们平 ...

  5. 流水线技术原理和Verilog HDL实现(转)

    源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...

  6. js中,怎么解决cookie里面中文乱码问题

    呵呵,我查了百度和谷歌,都没找到解决方案,但是,最终直接结合两个函数就可以了,哈哈哈,开心ing function getCookie(name) { var prefix = name + &quo ...

  7. iOS开发——判断邮箱格式

    //判断邮箱格式 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@ ...

  8. LPC2478的硬件IIC使用

    LPC2478的IIC使用 LPC2478带有三个IIC接口,每个IIC都可以工作在主机或者从机模式下,LPC的IIC的架构是一种状态机的形式,在不同的的时间做不同的工作之后有不同的状态来表示, 简单 ...

  9. @synthesize和@dynamic

    @synthesize 除非开发人员已经做了,否则由编译器自动生成getter/setter方法.当开发人员自定义存或取方法时,自定义会屏蔽自动生成该方法. @dynamic 告诉编译器,不自动生成g ...

  10. HDU 3501 Calculation 2 ——Dirichlet积

    [题目分析] 卷积太有趣了. 最终得出结论,互质数和为n*phi(n)/2即可. 计算(n*(n+1)/2-n-n*phi(n)/2)%md,用反正法即可证明. [代码] #include <c ...