日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用 Roslyn 编译器服务

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Roslyn 编译器服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

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

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

經典的HelloWorld

首先還是以經典的Hello World來開始介紹如何執行腳本吧。

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);

??? }

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

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

Console.WriteLine(scriptState );

在會話中執行腳本

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

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

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

究其原因,是因為CSharpScript.RunAsync 函數每次都是在一個單獨的上下文中執行的,并不會和前面的語句產生關聯。如果我們要在CSharpScript.Create()函數創建一個腳本,通過函數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);

在腳本和程序中共享數據

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

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 把握的輸入傳給表達式,然后表達式就可以計算結果,這個就是我們在工作流引擎里面要的表達式計算了。

相關文章:?

  • .NET應用遷移到.NET Core(一)

  • .NET應用遷移到.NET Core(二)風險評估

  • .NET應用遷移到.NET Core(三)從商業角度看移植過程

  • .NET應用遷移到.NET Core--調查案例

  • 遷移傳統.net 應用到.net core [視頻]

原文地址:http://www.cnblogs.com/shanyou/p/6224582.html


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

贊賞

人贊賞

總結

以上是生活随笔為你收集整理的使用 Roslyn 编译器服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。