我正在使用Microsoft.CSharp.CSharpCodeProvider以编程方式编译程序集&从外部.cs文件运行一些函数。
但有没有办法禁止这些函数对文件系统等进行任何更改(我需要在某种沙盒中运行它们)?
我在考虑在CompilerParameters中添加“-nostdlib”选项,因此生成的程序集将无法访问System.IO.File和其他类。但我仍然需要System.Object,System.ValueType等
现在我收到这些错误:
error CS0518: The predefined type `System.Object' is not defined or imported
error CS0518: The predefined type `System.ValueType' is not defined or imported
error CS0518: The predefined type `System.Attribute' is not defined or imported
error CS0518: The predefined type `System.Int32' is not defined or imported
... (too many of them)
如何添加那些可能严重损害系统的类(如System.IO.File,System.IO.Directory,System.Net。(某物),System.Threading。(某事物)?)
或者,也许有更简单的方法?谢谢。
答案 0 :(得分:0)
通过导入基本System
类型,例如System.Object
或System.Int32
,您可以导入mscorlib.dll中包含的所有内容,例如System.IO.Stream
。您不能简单地配置导入,以便在程序集中不包含某些类型。据我所知,你唯一的方法是构建自己的 stdlib - 或者构建自己的编译器,但这是另一个故事。
希望感谢Mono项目,它应该不会太难。您可以在GitHub上提取最新来源。更具体地说,看看the corlib folder。从那以简单地删除您不希望用户使用的所有内容。
最后,将自定义mscorlib.dll
添加到ReferencedAssemblies
并设置/nostdlib
就足够了。
如果您喜欢硬核,可以尝试使用Cecil来实现这一目标。使用这个精彩的库,您可以轻松查找类型,删除它们并保存修补的程序集。
另一种方法是在加载的程序集执行之前检查已加载的程序集。这不是那么微不足道,但塞西尔可能会有所帮助。看看这个问题:.NET Reflection: Find used types
无论你选择什么,祝你好运,玩得开心:)
答案 1 :(得分:0)