前言

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

使用

加载脚本

             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的更多相关文章

  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. MySQL查询in操作 查询结果按in集合顺序显示_Mysql_脚本之家

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  2. MAC使用GITHUB

    作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. #什么是 ...

  3. Codeforces AIM Tech Round3

    打得最烂一场Codeforces,多次都错题,无限WA... A题: 题意:给定n个橘子的大小,大小超过b的丢掉,不足d的补充进来,同时超过d的部分去掉,问要去掉几次 分析:直接模拟即可 #inclu ...

  4. SpingMvc 注解的使用

    1.使用注解减少配置xml文件 2.注解可以降低耦合度 3.使用注解编写的普通类 import javax.servlet.http.HttpServletRequest; import org.sp ...

  5. Docker Swarm集群

    Docker Swarm集群 IP 10.6.17.11  管理节点 IP 10.6.17.12   节点A IP 10.6.17.13   节点B IP 10.6.17.14   节点C 安装 Sw ...

  6. 基于LNMP的Zabbbix之Zabbix Agent源码详细安装,但不给图

    基于LNMP的Zabbbix之Zabbix Server源码详细安装:http://www.cnblogs.com/losbyday/p/5828547.html wget http://jaist. ...

  7. HTML学习一(入门了解)

    基础部分---------------------------------一:简介HTML 是用来描述网页的一种语言.HTML 指的是超文本标记语言 (Hyper Text Markup Langua ...

  8. 15、手把手教你Extjs5(十五)各种Grid列的自定义渲染

    Grid各列已经能够展示出来了.列的类型包括字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自定义了各种类型的渲染样式: 1.整型:标题栏居中,数值靠右显示,正数颜色为蓝色,负数颜色为红色, ...

  9. HTTP协议快速入门

    一.定义 The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborativ ...

  10. jquery textarea输入字符字数提示

    效果: html代码: <textarea id="assayInfo" name="assayInfo" rows="3" cols ...