(此文章同時發表在本人微信公衆號「dotNET每日精華文章」,歡迎右邊二維碼來關注。)api
微軟的下一代編譯器技術Roslyn是一個里程碑的技術,能夠給.NET平臺帶來無限想象空間。好比今天推薦文章中談到的,給C#開發一個交互腳本引擎。微信
Roslyn(即.NET Compiler Platform)是微軟開源的C#和Visual Basic編譯器,其包含了豐富的代碼分析API,讓你可以利用熟悉的語言和工具來構建代碼分析工具。架構
隨着VS 2015 RC的發佈,Roslyn也進入了Go Live(即功能已經凍結,就等修復一些bug),那麼咱們也就能夠開始在一些實際的產品中應用它了。在今天推薦的文章中,Christian Jacobsen給你們展現了一個小技巧——如何利用Roslyn的特性來實現一個相似F#交互窗口那樣的C#交互窗口。工具
首先實現一個很是簡單的腳本執行引擎:ui
public class CSharpScriptEngine { private static Script _previousInput; private static Lazy<object> _nextInputState = new Lazy<object>(); public static object Execute(string code) { var script = CSharpScript.Create(code, ScriptOptions.Default).WithPrevious(_previousInput); var endState = script.Run(_nextInputState.Value); _previousInput = endState.Script; _nextInputState = new Lazy<object>(() => endState); return endState.ReturnValue; } }
以上代碼只需引用Microsoft.CodeAnalysis.CSharp和Microsoft.CodeAnalysis.Scripting這兩個Nuget。url
爲了實現交互窗口,能夠採用C/S架構。Server端是一個SelfHost的Web Api,以下:spa
public class CodeController : ApiController { // POST api/code public void Post([FromBody]string code) { Console.WriteLine(CSharpScriptEngine.Execute(code)); } } static void Main(string[] args) { string baseAddress = "http://localhost:9000/"; // Start OWIN host using (WebApp.Start<Startup>(url: baseAddress)) { while (true) { var str = Console.ReadLine(); Console.WriteLine(CSharpScriptEngine.Execute(str)); } } }
Client端是一個標準的Windows Forms窗體,在Alt+Enter的時候,把錄入的代碼發送到Server進行執行,並在Server端顯示出執行結果:code
private void CodeEdit_KeyDown(object sender, KeyEventArgs e) { if (CodeEdit.SelectedText.Length > 0 && e.KeyCode == Keys.Enter && e.Alt) { string baseAddress = "http://localhost:9000/"; using (var client = new HttpClient()) { var response = client.PostAsJsonAsync(baseAddress + "api/code", CodeEdit.SelectedText).Result; } } }
這個示例代碼雖然簡單,卻展現了Roslyn的強大的和實現交互窗口的基本思路。經過「閱讀原文」能夠找到完整的源代碼地址。orm
原文地址:http://www.jayway.com/2015/05/09/using-roslyn-to-build-a-simple-c-interactive-script-engine/ip