LuaInterface – 如何限制对.Net类的访问?
我正在尝试使用LuaInterface 2.0.3在我的C#应用程序中嵌入一些Lua脚本function。 到目前为止,这工作正常,但我无法弄清楚如何限制只访问少数指定的.Net类。 默认情况下,所有.Net库都可以通过“luanet”直接访问,Lua脚本可以自由打开新窗口或访问文件系统。
例如,这个Lua脚本将打开一个新窗口:
Form = luanet.System.Windows.Forms.Form mainForm = Form() mainForm:ShowDialog()
编写脚本的自由度很高,但这可能会干扰托管应用程序,并且具有一些我不太喜欢的与安全相关的含义。 有没有办法禁用它?
--make a table for all the classes you want to expose safeClasses = {} --store all the ones you want safeClasses.Form = luanet.System.Windows.Forms.Form --etc... --remove access to LuaInterface luanet = nil package.loaded.luanet = nil --prevent future packages from being loaded require = nil package.loadlib = nil
您也可以反向执行此操作,首先删除LuaInterface的全局和存储实例,然后通过本地引用(该块的其余部分中的所有代码都可以使用)完成所有工作:
--get a local reference to LuaInterface without clobbering the name local luainterface = luanet --delete the global reference to it luanet = nil --also delete it from the package store and disable package loading package.loaded.luanet = nil require = nil package.loadlib = nil --put luanet back locally at its original name (for convenience) local luanet = luainterface --make a table for all the classes you want to expose safeClasses = {} --store all the ones you want safeClasses.Form = luanet.System.Windows.Forms.Form --etc...
(您可以通过直接本地化到luanet
,然后通过_G
引用删除全局表来避免上面的三步名称保存舞蹈( local luainterface=luanet; luanet=nil; local luanet=luainterface
):
local luanet=_G.luanet _G.luanet = nil
我只是选择不作为个人喜好。)
我不确定你会怎么做,但第一步应该是在额外的AppDomain中托管它。 使用这个额外的appdomain,你可以精确控制可以使用哪些模块,但是,它不会增加额外的工作来在主程序和脚本之间移动数据。
AssemblyLoad
/ AssemblyResolve
事件应该是您的第一站。
- JSON到C# – 在json中列出没有子字段名称的字段?
- LINQ to Entities无法识别方法’Int32 Int32(System.String)’方法,并且此方法无法转换为存储表达式
- 我可以在mac上编程c#吗?
- LINQ to Entities中不支持指定的类型成员
- 如何处理从VBA中的C#方法返回的字符串数组
- 如何在基于事件的设计中使用Azure Batch并终止/清除已完成的作业
- 如何在Xml中保存DatagridView并将Xml加载到datagridView?
- C#DynamicLinq where子句与Any()
- DataGridViewCheckBoxCell如何在表单加载期间设置时显示检查