利用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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM