C# Roslyn脚本-不带“的脚本;系统“;

C# Roslyn脚本-不带“的脚本;系统“;,c#,scripting,visual-studio-2015,roslyn,C#,Scripting,Visual Studio 2015,Roslyn,在这篇文章中,我想写一个C#脚本引擎来工作。我尝试过以下代码: System.IO.StreamReader sr = new System.IO.StreamReader("example.txt"); var prog = sr.ReadToEnd(); sr.Close(); ScriptOptions so = ScriptOptions.Default; Console.WriteLine(CSharpScript.RunAsync(prog, so).Result

在这篇文章中,我想写一个C#脚本引擎来工作。我尝试过以下代码:

System.IO.StreamReader sr = new System.IO.StreamReader("example.txt");
var prog = sr.ReadToEnd();
sr.Close();
ScriptOptions so = ScriptOptions.Default;
Console.WriteLine(CSharpScript.RunAsync(prog, so).Result.GetVariable("sum").Value);
Console.ReadKey();
example.txt的文件内容为:

System.IO.StreamReader sr = new System.IO.StreamReader("foo.txt");
string s = sr.ReadToEnd();
int sum = System.Convert.ToInt32(s);
现在我想限制用户只使用C#的基本函数(使用int、string、while、for)和一些自定义函数,而不是整个.NET库。但是,即使我没有包括System.IO als引用,用户也可以键入System.IO.something并获得正确的内容

是否有可能从脚本中删除对“系统”的访问权限


我很高兴有任何答案。

您需要正确设置
脚本选项
,这意味着需要使用自定义的
MetadataReferenceSolver
,而不是默认的,即自动解析缺少的引用。我不知道是否已经有一个解析器只根据其参数解析程序集,但您肯定可以实现您的。检查一下,它做了类似的事情

更新
这不适用于mscorlib中定义的内容。

您所说的“从脚本中删除对“系统”的访问”是什么意思?不应使用任何系统元素。例如,编写脚本的用户根本不可能使用System.IO.StreamReader、System.Convert或System.Threading.Thread。是否要实现沙盒,或禁用
系统
命名空间中的任何内容?后者可以通过分析输入代码并检查每个符号的名称空间来实现。前者可以通过将代码加载到单独的应用程序域中,并指定应用程序域的权限来完成。我想构建一个类似脚本API的东西,其中C#app为用户提供了一些方法,例如包装文件访问。例如,我希望确保文件只能写入某个文件夹及其子文件夹。因此,我想限制用户使用System.IO等,但使用我预定义的方法,在用户执行请求之前进行检查。AppDomain方法在我看来相当不错。但是,我怎样才能提供这些方法而不重新定义它们呢?我可以从新的AppDomain调用原始应用程序来限制用户代码而不是API方法吗?非常感谢您的帮助。我实现了自己的ScriptOptions和RuntimeMetadataReferenceResolver类(通过从原始类中删除seal关键字并从它们继承),并使ResolveReference方法返回空的ImmutableArray。不幸的是,我的解决方案与原始脚本选项完全相同。还有什么地方需要我修改吗?你能提供代码让我们检查一下吗?此外,我还看到一条评论,说它只会影响编译未显式引用的程序集的加载。我检查了脚本对象,默认情况下它有一个对mscorlib的引用。回到最初的问题,您可能需要从代码中创建自己的编译并将其加载到自己的appdomain中。检查一下这个(有点过时)沙箱输入源代码。然后您可以指定
IsolatedStorageFilePermission
以允许使用私有虚拟文件系统。