如何使用Roslyn編譯器服務(wù)

本篇文章給大家分享的是有關(guān)如何使用Roslyn編譯器服務(wù),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

為尼勒克等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及尼勒克網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計、成都網(wǎng)站制作、尼勒克網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

.NET Core和 .NET 4.6中 的C# 6/7 中的編譯器Roslyn 一個重要的特性就是"Compiler as a Service",簡單的講,就是就是將編譯器開放為一種可在代碼中調(diào)用的服務(wù), 通常在工作流引擎 或是規(guī)則引擎中都需要一項功能是計算表達式, 在沒有Roslyn 之前我通常借助于Antlr [Antlr(“又一個語言識別工具”的縮寫)是一個最初用Java編寫的庫,可以根據(jù)特殊的語法(文法)來構(gòu)建復(fù)雜的解析器代碼。它就像是一個用于語言解析的加強版的正則表達式。你可以編寫某種語言的語法規(guī)則,Antlr會為你生成代碼],基于Antlr 有一個輕量級的C#編譯器服務(wù)Expression Evaluator 。

要在自己的代碼中使用Roslyn 執(zhí)行C#腳本,首先進行如下幾步準備工作。

1、通過Nuget 安裝Microsoft.CodeAnalysis.CSharp.Scripting

2、在代碼中增加如下命名空間的引用。

using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;

經(jīng)典的HelloWorld

首先還是以經(jīng)典的Hello World來開始介紹如何執(zhí)行腳本吧。

static void Main(string[] args)
    {
           var options =
               ScriptOptions.Default
              .AddReferences("System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");

           var bar = new Bar() { StaffId = 5686, UnitId = 2 , Age = 15};
           Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync("System.Console.WriteLine(\"hello world\");", options);

    }

從上述代碼中可以看出,執(zhí)行一個腳本還是比較簡單的, 可以通過Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync() 函數(shù)執(zhí)行自己的腳本了,如果我們要獲取腳本的返回值,也是很容易的。

var scriptState = CSharpScript.RunAsync<int>("3+2*5", ScriptOptions.Default);

Console.WriteLine(scriptState );

在會話中執(zhí)行腳本

很多時候,我們無法一次執(zhí)行所有的腳本,而是像shell中那樣輸入一句執(zhí)行一句的。假如我們執(zhí)行如下代碼

Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync("var i = 3;");
var result = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync("i * 2");

得到的并不是我們想要的結(jié)果6,而是一個異常:

如何使用Roslyn編譯器服務(wù)

究其原因,是因為CSharpScript.RunAsync 函數(shù)每次都是在一個單獨的上下文中執(zhí)行的,并不會和前面的語句產(chǎn)生關(guān)聯(lián)。如果我們要在CSharpScript.Create()函數(shù)創(chuàng)建一個腳本,通過函數(shù)ContinueWith 組成一個完整的腳本運行。正確方式如下:

var s0 = CSharpScript.Create("int x = 1;");
           var s1 = s0.ContinueWith("int y = 2;");           
           var s2 = s1.ContinueWith<int>("x + y");
           Console.WriteLine(s2.RunAsync().Result.ReturnValue);

在腳本和程序中共享數(shù)據(jù)

我們在執(zhí)行腳本時,除了獲取腳本的輸出外,許多時候需要設(shè)置腳本的輸入,要設(shè)置輸入的方式也有許多。最直接的方式拼接腳本但這么做的效率和可維護性是十分差的。另外也可以通過傳統(tǒng)的IPC通信機制——文件、Socket等方式,這種方式一來比較麻煩,二來對于復(fù)雜的對象來說,還牽涉到序列化,也是非常不便。

Roslyn提供了一個更為簡單有效的解決辦法:在會話中傳入一個宿主對象,會話中的腳本程序也能訪問宿主對象的各成員變量。

namespace RoslynCosonle
{
    class Program
    {
        static void Main(string[] args)
        {
            var options =
                ScriptOptions.Default
               .AddReferences("System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");         

            var s0 = CSharpScript.Create("int x = 1;");
            var s1 = s0.ContinueWith("int y = 2;");           
            var s2 = s1.ContinueWith<int>("x + y");
            Console.WriteLine(s2.RunAsync().Result.ReturnValue);

           var bar = new Bar() { StaffId = 5686, UnitId = 2 , Age = 15};
            Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync("System.Console.WriteLine( (StaffId==5686 && UnitId==2)||( UnitId == 3|| Age >10) );", options, bar);

 
        }
    }

    public class Bar
    {
        public string Foo => "Hello World!";
       
        public int StaffId { get; set; }

        public int UnitId { get; set; }

        public int Age { get; set; }
    }

通過對象Bar 把握的輸入傳給表達式,然后表達式就可以計算結(jié)果,這個就是我們在工作流引擎里面要的表達式計算了。

以上就是如何使用Roslyn編譯器服務(wù),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前題目:如何使用Roslyn編譯器服務(wù)
文章鏈接:http://www.muchs.cn/article26/ipppjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、服務(wù)器托管網(wǎng)站策劃、網(wǎng)站內(nèi)鏈、企業(yè)網(wǎng)站制作標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司