利用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/
利用Roslyn构建一个简单的C#交互脚本引擎的更多相关文章
- 利用 Docker 构建一个简单的 java 开发编译环境
目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...
- 利用angular4和nodejs-express构建一个简单的网站(五)—用户的注册和登录-HttpClient
上一节简单介绍了一下利用angular构建的主路由模块,根据上一节的介绍,主页面加载时直接跳转到用户管理界面,下面就来介绍一下用户管理模块.启动应用后,初始界面应该是这样的: 用户管理模块(users ...
- 利用ANTLR4实现一个简单的四则运算计算器
利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...
- 利用 vue-cli 构建一个 Vue 项目
一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...
- 构建一个简单的基于MVC模式的JavaWeb
零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...
- 通过python 构建一个简单的聊天服务器
构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...
- 基于 Roslyn 实现一个简单的条件解析引擎
基于 Roslyn 实现一个简单的条件解析引擎 Intro 最近在做一个勋章的服务,我们想定义一些勋章的获取条件,满足条件之后就给用户颁发一个勋章,定义条件的时候会定义需要哪些参数,参数的类型,获取勋 ...
- 利用ELK构建一个小型的日志收集平台
利用ELK构建一个小型日志收集平台 伴随着应用以及集群的扩展,查看日志的方式总是不方便,我们希望可以有一个便于我们查询及提醒功能的平台:那么首先需要剖析有几步呢? 格式定义 --> 日志收集 - ...
- struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...
随机推荐
- Linux CAT与ECHO命令详解 <<EOF EOF
Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: .一次显示整个文件. $ cat filename .从键盘 ...
- css3创建3D场景
浏览器本身是一个2维平面,对于3D的情况,实际上是增加了一个维度(深度),所以我们需要创建一个3D场景.这时浏览器不仅仅是一个平面了,更像是一个窗口,我们透过这个窗口去观察里面的三维世界.所谓的创建3 ...
- 用pywinauto进行win32应用程序的测试
之前做win32应用测试时,用过很多大家耳熟成详的工具,接触pywinauto之前,对它的了解也不多,然而,随着对它了解的增多,发现它借助了python动态对象的能力,使得代码即便于书定,也便于阅读, ...
- map的使用
@Override public List<Map<String, Object>> findSchedule(Date beginTime, Date endTime, Lo ...
- pdf.js使用教程
pdf.js框架的魅力所在,为其为HTML5实现的,无需任何本地支持,而且对浏览器的兼容性也是比较好,要求只有一个:浏览器支持HTML5就好了!(不过对于低版本的IE,就只能节哀了!) 据说IE9以上 ...
- 【leetcode】Validate Binary Search Tree(middle)
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- [Android Pro] Android 进程级别 和 oom_adj对应关系
一 : 前台进程 (Active Process): oom_adj为0. 前台进程包括 : 1 : 活动 正在前台接收用户输入 2:活动.服务与广播接收器正在执行一个onReceive事件的处理函数 ...
- September 10th 2016 Week 37th Saturday
An innovation that goes beyond imagination again raised the standard. 颠覆想象的创新,再一次刷新标准. An advertisem ...
- mongochef如何链接有权限的mongodb3.x数据库
废话不多说,直接上图: 1.打开mongochef 2.打开的界面是这样的: 3.点击connect,上图红色框中的按钮,不要点下拉三角 4.点击New Connection按钮 5.1:上图标注1, ...
- 绿色通道(codevs 3342)
题目描述 Description <思远高考绿色通道>(Green Passage, GP)是唐山一中常用的练习册之一,其题量之大深受lsz等许多oiers的痛恨,其中又以数学绿色通道为最 ...