2015-11-16 62 views
2

作爲this文章我想寫一點C#腳本引擎來工作。我曾嘗試這樣的代碼:Roslyn腳本 - 無「系統」腳本

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#只有基本功能(使用整型,字符串,而,for)和一些自定義函數,但不是整個.NET庫。但即使我不包含System.IO als引用,用戶也可以鍵入System.IO.something並且會得到正確的結果。

是否有可能從腳本中刪除對「系統」的訪問?

我很高興與任何答案。

+0

你是什麼意思「**從腳本**」中刪除對「系統」的訪問? –

+0

應該沒有任何可能使用系統的任何元素。例如。編寫腳本的用戶應該無法使用System.IO.StreamReader,System.Convert或System.Threading.Thread。 – pBuch

+0

你想實現沙盒,還是禁用'System'命名空間中的任何東西?後者可以通過分析輸入代碼並檢查每個符號的命名空間來實現。前者可以通過將代碼加載到單獨的應用程序域中並指定應用程序域的權限來完成。 – Tamas

回答

1

您需要正確設置ScriptingOptions,這意味着需要使用自定義MetadataReferenceResolver而不是默認的自動解析缺失引用。我不知道是否已經有一個解析器只根據其參數解析程序集,但是您當然可以實現您的。查看TestMetadataReferenceResolver,它做了類似的事情。

更新 這不適用於在mscorlib中定義的內容。

+0

非常感謝您的幫助。我實現了自己的ScriptOptions和RuntimeMetadataReferenceResolver類(通過從原始類中刪除seal關鍵字並從中繼承),並使ResolveReference方法返回一個空的ImmutableArray。不幸的是,我的解決方案與原始ScriptOptions完全相同。還有一點我必須改變一些事情嗎? – pBuch

+0

你能否提供我們的代碼來檢查它?另外,我剛剛在['ResolveMissingAssemblies'](http://source.roslyn.io/#Microsoft.CodeAnalysis/MetadataReference/MetadataReferenceResolver.cs,cfee6ff1c43f8166)之上發現了一條評論,表示它只顯式影響裝配加載彙編引用。值得看看這些組件是什麼。 – Tamas

+1

我檢查了腳本對象,並且它默認具有對mscorlib的引用。因此,回到原來的問題,您可能需要從代碼創建自己的編譯並將其加載到它自己的appdomain中。看看這個(有點過時)[概念驗證](http://www.filipekberg.se/2011/12/08/hosted-execution-of-smaller-code-snippets-with-roslyn/)用於沙箱輸入源代碼。然後,您可以指定'IsolatedStorageFilePermission'來允許使用私有虛擬文件系統。 – Tamas