(此文章同时发表在本人微信公众号“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