千家信息网

如何使用Roslyn编译器服务

发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,本篇文章给大家分享的是有关如何使用Roslyn编译器服务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。.NET Core和 .NET 4
千家信息网最后更新 2024年11月18日如何使用Roslyn编译器服务

本篇文章给大家分享的是有关如何使用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("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("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("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 把握的输入传给表达式,然后表达式就可以计算结果,这个就是我们在工作流引擎里面要的表达式计算了。

以上就是如何使用Roslyn编译器服务,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

脚本 代码 编译器 编译 就是 方式 表达式 服务 函数 对象 工作 输入 引擎 语言 C# 复杂 可以通过 宿主 工作流 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华为云桌面应用服务器准备中 湖北地级市网络安全协会 电影网app对服务器配置要求 上海应用技术大学数据库 冬奥会2022年网络安全保障期 中移信息软件开发岗怎样 网络安全专职人员情况 win7防护墙数据库端口 网络营销软件开发反馈 app通过什么协议与服务器 宣城医院软件开发定制 2016年度网络安全报告 视频软件开发工资高吗 滨州管理软件开发 学校数据库没有金融行业数据 常用的数据库主要类型 深圳哪里有学软件软件开发的 网络安全应该具备什么知识 浪潮服务器bmc怎么安装系统 网络安全(安防)股票 sql数据库 索引 南京定制软件开发解决方案 统计上常用的数据库 远程服务器管理技巧 搭建linux服务器 浪潮服务器的序列号 回旋打击服务器在哪个区 杭州戴尔服务器公司定制 2022魔兽世界转服务器多少钱 番禺区光纤网络技术开发咨询报价
0