.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.C