zoukankan      html  css  js  c++  java
  • 利用Roslyn构建一个简单的C#交互脚本引擎

    (此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)

    微软的下一代编译器技术Roslyn是一个里程碑的技术,可以给.NET平台带来无限想象空间。比如今天推荐文章中谈到的,给C#开发一个交互脚本引擎。

    Roslyn(即.NET Compiler Platform)是微软开源的C#和Visual Basic编译器,其包含了丰富的代码分析API,让你能够利用熟悉的语言和工具来构建代码分析工具。

    随着VS 2015 RC的发布,Roslyn也进入了Go Live(即功能已经冻结,就等修复一些bug),那么我们也就可以开始在一些实际的产品中应用它了。在今天推荐的文章中,Christian Jacobsen给大家展示了一个小技巧——如何利用Roslyn的特性来实现一个类似F#交互窗口那样的C#交互窗口。

    首先实现一个非常简单的脚本执行引擎:

    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。

    为了实现交互窗口,可以采用C/S架构。Server端是一个SelfHost的Web Api,如下:

    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端显示出执行结果:

    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的强大的和实现交互窗口的基本思路。通过“阅读原文”可以找到完整的源代码地址。

    原文地址:http://www.jayway.com/2015/05/09/using-roslyn-to-build-a-simple-c-interactive-script-engine/

  • 相关阅读:
    Cassandra的数据模型
    数组中只出现一次的数
    MyBatis总结
    Java线程池的使用
    Fork/Join框架详解
    WWW
    DNS远程和DNS日志
    [DNS]ACL、also-notify、视图服务器及安全设置
    Linux入门进阶第六天——登录文件、开机与模块管理
    Linux入门进阶第四天——服务管理
  • 原文地址:https://www.cnblogs.com/redmoon/p/4501913.html
Copyright © 2011-2022 走看看