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官方文档
有问题欢迎留言| ω・´)
- C# Lua5.2.3 SandBox 结合
- Vs2012 编译配置 Lua5.2.3
- Winidows下编译lua5.2.3
- lua5.2.3源码阅读笔记
- Sandbox
- Sandbox
- sandbox
- 在Win7下编译Lua5.2.3
- build lua5.2.3 on windows by scons
- Lua5.2.3源码阅读(1)-TValue,TString
- Lua5.2.3源码阅读(1)-TValue,TString
- Lua5.2.3源码阅读(2)-Table
- Lua5.2.3源码阅读(2)-Table
- Lua5.2.3源码阅读--Table(ipairs,pairs)
- C#结合EmguCv编程
- C#结合超级狗
- Hortonworks Sandbox 2.3的Ranger插件缺陷
- Lua5.2.3源码阅读(3)-Table(ipairs,pairs)
- Cache Operation in AngularJS
- 百度编辑器换皮肤,价格好商量
- LPCXpresso的下载
- 2014年7月24日 5点57分
- WEB开发中常用的子页面调用父页面方式
- C# Lua5.2.3 SandBox 结合
- linux上swap的查看与调整实例大全
- 正确设置Linux swap分区方法详解
- 还有未能欣赏的碑
- Android模拟登陆带验证码的网站客户端
- HttpWatch工具简介及使用技巧
- 什么版本测试通过就能发布?
- 解决windows图片查看器背景色变成米黄色
- 了解TDD