首页 技术 正文
技术 2022年11月15日
0 收藏 608 点赞 4,396 浏览 1795 个字

(此文章同时发表在本人微信公众号“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/

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,486
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,126
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,287