使用mono和-nostdlib进行编译

时间:2013-06-05 17:44:25

标签: c# mono gmcs

我正在使用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。(某事物)?)

或者,也许有更简单的方法?谢谢。

2 个答案:

答案 0 :(得分:0)

通过导入基本System类型,例如System.ObjectSystem.Int32,您可以导入mscorlib.dll中包含的所有内容,例如System.IO.Stream。您不能简单地配置导入,以便在程序集中不包含某些类型。据我所知,你唯一的方法是构建自己的 stdlib - 或者构建自己的编译器,但这是另一个故事。

希望感谢Mono项目,它应该不会太难。您可以在GitHub上提取最新来源。更具体地说,看看the corlib folder。从那以简单地删除您不希望用户使用的所有内容。 最后,将自定义mscorlib.dll添加到ReferencedAssemblies并设置/nostdlib就足够了。

如果您喜欢硬核,可以尝试使用Cecil来实现这一目标。使用这个精彩的库,您可以轻松查找类型,删除它们并保存修补的程序集。

另一种方法是在加载的程序集执行之前检查已加载的程序集。这不是那么微不足道,但塞西尔可能会有所帮助。看看这个问题:.NET Reflection: Find used types

无论你选择什么,祝你好运,玩得开心:)

答案 1 :(得分:0)

您应该为此使用代码访问安全性。虽然您不能限制程序对System.IO类型的访问权限而不限制其对System.Object等核心类型的访问,但您可以通过限制代码可以执行的操作来实现运行时沙箱在运行时。

CAS允许您根据从用户身份或其他来源派生的各种证据类型为不同类型的代码分配权限。这允许对代码可以执行的细粒度调整。它可以通过命令式(即基于代码)和声明性(即基于属性)机制来控制。

CAS是一个很大的主题,这个描述必须简短。

以下是MonoMSDN的文档。