前言

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. With PHP frameworks, why is the “route” concept used?

    http://programmers.stackexchange.com/questions/122190/with-php-frameworks-why-is-the-route-concept-u ...

  2. 毕业论文评审意见、导师意见范文、模板_Smile~风_百度空间

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

  3. NBUT 1457 Sona

    莫队算法+离散化 1.map会TLE,必须离散化做 2.long long会WA,__int64定义 %I64d输出输出能AC 3.注意输入的序列会爆int #include<cstdio> ...

  4. UILabel的抗压缩、抗拉伸、以及控件的约束简述

    今天来说一说UILabel的约束设置问题 首先主要介绍:Priority(控件约束的优先级).Content Hugging Priority(控件抗拉伸优先级).Content Compressio ...

  5. java 单元测试 注入

    ApplicationContext appContext = new ClassPathXmlApplicationContext("appContext.xml"); MySQ ...

  6. 使用eclipse和JavaFX Scene Builder进行快速构建JavaFX应用程序

    http://blog.csdn.net/wingfourever/article/details/7726724 使用eclipse和JavaFX Scene Builder进行快速构建JavaFX ...

  7. (简单) POJ 3264 Balanced Lineup,RMQ。

    Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same ...

  8. Laravel邮件发送问题小解

    在Laravel中已经有内置了发送邮件的功能,通过 Mail::send 可发送邮件,但要使用这个函数必须先进行相关配置. 在 /app/config/mail.php 中设置你的邮件参数,如下: 1 ...

  9. 一种比较简单的在USB U盘中访问nandflash的方法

    u8 nandflash_write_buffer[NAND_SERECT_FULL_SIZE]; static int currentBlock = -1; static int currentPa ...

  10. tornado 增加日志模块

    log类 #!/usr/bin/env python # -*- coding:utf-8 -*- import logging.handlers class Logger(logging.Logge ...