C# Lua5.2.3 SandBox 结合

来源:互联网 发布:淘宝客服问题大全 编辑:程序博客网 时间:2024/05/22 10:47

最近刚刚接触Lua,语言不愧是短小精湛,功能也很强大。

网上有关C#和Lua的文章大多数是Lua5.1版本,5.2版本的Lua做了一些比较大的改动,其中就有沙箱技术的改动(_ENV)


提一句,SharpLua现在的版本仍旧是Lua5.1.5。NLua同样支持.Net技术,当前支持的版本是Lua5.2.3

NLua GitHub→点击打开链接

调用NLua工程需要包含三个dll——KeraLua.dll NLua.dll lua52.dll  ,然后 using Lua; 就可以使用。


以下是C#的代码,具体看注释:

using NLua;namespace Lua_SandBox实验{    class Program    {        static void Main(string[] args)        {            Lua myLua = new Lua();//Lua虚拟机            TempClass tc = new TempClass();</span><pre name="code" class="csharp"><span style="font-size:14px;">            //从TempClass的tc实例中获得writeStr方法,然后注册到Lua虚拟机里</span>
            myLua.RegisterFunction("writeStr", tc, tc.GetType().GetMethod("writeStr"));
//Lua沙箱文件
            myLua.DoFile("sandbox.lua");
//获得sandbox函数,传递两个参数,第一个是要在沙箱里执行的文件,还有一个是writeStr需要的参数
            myLua.GetFunction("sandbox").Call("unsafe_code.lua","Hello Lua!");
        }
    }

    class TempClass
    {
//注意,writeStr必须设定为public,否则调用RegisterFunction会报错
        public void writeStr(string str)
        {
            Console.WriteLine(str);
        }
    }
}

unsafe_code.lua代码:

--unsafe codefunction unsafe_code(str)print("Hello World!")writeStr(str)endreturn unsafe_code</span>


以下是sandbox.lua的代码(核心!!!):

function sandbox(path,str) --接受两个参数:要执行的不安全代码,writeStr需要的参数--加载不安全代码,并且设定沙箱内允许执行的代码(print和writeStr)local code1 = loadfile(path,"t",{ print = _ENV["print"], writeStr = _ENV["writeStr"] })--pcall函数调用code1pcall(code1(),str)end</span>

分析:

loadfile(path, "t", {print = _ENV["print"], writeStr = _ENV["writeStr"] } )

第一个参数是要加载的文件;

第二个参数有三种选择:“t"——加载文件中的text,“b"——加载文件中的binary,“bt”——文本和二进制都加载

第三个函数是沙箱的设定:print = _ENV["print"]意思是从当前的_ENV环境中获得print这个方法,然后把它赋值给print。于是乎,“unsafe_code.lua”的执行环境中就有个print方法。多说一句,如果写成 print450 = _ENV["print"],那么在“unsafe_code.lua"中就需要写 print450("Hello World!")。

总而言之,设定好一个只允许print和writeStr的环境,然后让不安全代码在其中执行。

loadfile官方文档


输出结果:

Hello World!

Hello Lua!


//————————————分割线————————————

个别注意补充:

pcall执行过程当中,如果遇到异常(比如说沙箱中不允许io,但是不安全代码中有io语句),之后的语句则不会继续执行。说白了就是抛出异常。

pcall返回两个值,第一个值是true(成功执行),第二个值就是执行函数的结果;如果pcall执行时遇到异常,则第一个值是false,第二个值就是错误信息。

pcall官方文档


有问题欢迎留言| ω・´)

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大孩子不洗澡怎么办啊 2岁宝宝不爱洗澡怎么办 手指画颜料变干怎么办 刮画纸画错了怎么办 电脑绘的图不能扩大怎么办 华腾同步课堂忘记密码怎么办 被缝纫机针扎了怎么办 大小孩抢了孩子玩具怎么办 无锡天一初中考不进天一高中怎么办 校考一个都没过怎么办 拼音会拼不会写怎么办 20岁出头很迷茫怎么办 出了社会很迷茫怎么办 2018年现在会计工作难找怎么办 开广告店没生意怎么办 淘宝没有7天退怎么办 吃了松香的鸭子怎么办 理科生考电影专业研究生怎么办 pr导出视频很慢怎么办 8岁儿童头发稀少怎么办 八岁儿童版头发怎么办 小孩子有一块不长头发怎么办 小孩子头发上长癣怎么办 一岁多头发少怎么办 孩子头发长得慢怎么办 小孩头发长得慢怎么办 头发出油不洗头怎么办 青少年掉头发很厉害怎么办 洗了冷水头头痛怎么办 头发烫染后干枯毛躁怎么办 扎不起来的短发怎么办 发际线掉头发怎么办偏方 头上脓包掉头发怎么办 小孩头发少又黄怎么办 发旋哪里头发少怎么办 每次洗头发都掉好多怎么办 10岁儿童掉头发怎么办 1岁半宝宝掉头发怎么办 头发掉发严重怎么办吃什么 掉了一块钱很气怎么办 头发软又少怎么办盘头