前言

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. JQuery UI的拖拽功能

    JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...

  2. mysql建表---级联删除

    CREATE TABLE `roottb` (  `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,  `data` VARCHAR(100) NOT NUL ...

  3. frame间跳转及相关问题

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

  4. SpingMvc 注解的使用

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

  5. MySQL数据文件的导入、导出

    1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导 ...

  6. IOS开发中UIAlertController(警告框)的使用

    步骤一.初始化: UIAlertController * inputname = [UIAlertController alertControllerWithTitle:@"未输入账户&qu ...

  7. PHP利用数组构造JSON

    问题起因 以往都是直接用构造数组的形式构造json 例子: $arr = array("A"=>"1","B"=>"2 ...

  8. module_param()函数

    1.定义模块参数的方法: module_param(name, type, perm); 其中,name:表示参数的名字;     type:表示参数的类型;     perm:表示参数的访问权限; ...

  9. 医院his系统数据库恢复

    医院IT系统的重要性堪比金融行业,“银行系统宕机,老百姓不能取钱:医院HIS系统宕机,老百姓不能看病”, 医院信息系统称得上是迄今为止企业级信息系统中最复杂的一类.  某医院HIS系统SQL2008数 ...

  10. MVVM指南(课程学习)

    iOS MVVM 参考 iOS MVVM 前世今生 iOS MVVM 优缺点 下面是我对MVVM知识的总结,主要包括模块划分.开发步骤.重点解说三部分.做这篇文章,主要是考虑总结出可执行的开发步骤,按 ...