前言

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. php中serialize、unserialize与json_encode、json_decode比较

    性能比较 同一个变量编码或解码10000次,每个函数执行10000次所需时间 php5.2.13 json : 190 serialize : 257 json_encode : 0.08364200 ...

  2. Apache2 三种MPM对比分析

    就最新版本的Web服务器Apache(版本是Apache 2.4.10,发布于2014年7月21日)来说,一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式. ...

  3. [iOS、Unity、Android] 浅谈闭包的使用方法

    前言 我们经常所编程语言的的进步速度是落后于硬件的发展速度的. 但是最近几年,闭包语法在各个语言中都有自己的体现形式,例如 • C语言中使用函数指针作为回调函数的入口: • Java和C#语言中的La ...

  4. 用OpenSSL生成自签名证书在IIS上搭建Https站点(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

  5. SD卡兼容性问题(转)

    看到一篇关于硬件抗干扰的应用实例,很有参考值.所以,转过来方便查找. 源文:SD卡兼容性问题 最近碰到了一个SD卡兼容性的问题.主芯片SD卡组的信号,经过转接板,长排线,然后再到SD卡子板之后.对多种 ...

  6. 【转】10个重要的Linux ps命令实战

    Linux作为Unix的衍生操作系统,Linux内建有查看当前进程的工具ps.这个工具能在命令行中使用. PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照.它能捕获系 ...

  7. C语言-switch语句

    switch (表达式的值) { case 1: 语句1 break; case 2: 语句2 break; case 3: 语句3 break; case 4: 语句4 break; ...... ...

  8. 1)Javascript设计模式:Module模式

    最简单的创建对象方法 function User(name) { this.name = name || '' } User.prototype.say = function() { console. ...

  9. Asp.Net集群中Session共享

    今天遇到了这个问题,于是研究了一下.要解决这个问题,首先就要明白一些Session的机理.Session在服务器是以散列表形式存在的,我们都知道Session是会话级的,每个用户访问都会生成一个Ses ...

  10. keystore 介绍

    Keytool 是一个有效的安全钥匙和证书的管理工具. Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存 ...