之前写过文章介绍过如何通过Roslyn构建自己的C#脚本,但那篇文章是参考自Roslyn CTP版的,记得本来想等到Roslyn正式版出来重新更新一下文档的,不过记得后来Roslyn是跳票了的,Scripting API在正式版本中都一度被移除了,这个更新就没有做下去了。

最近看到有人在原文中询问如何使用C# Script API,便查询了一下相关资料,这个功能是在的VS2015 update 1中才正式放出的,其时已经到16年了,使用方法与之前已经大有不同了,便重新写一篇。

C# Interactive窗口

微软在Visual Studio中已经提供了一个C#交互窗口,通过它就可以直接执行C# 脚本语句。

这个窗口是非常强大的,支持语法高亮,智能提示,使用起来是非常方便的。简单的一些静态函数测试可以直接在该窗口中进行,还是非常方便的。

C#命令行接口

C#交互窗口方式虽然很方便,但我们很多时候是希望脚本程序能脱离VisualStudio单独执行,此时我们可以用到的命令行程序csi.exe。

一方面csi程序可以以REPL方式执行输入的命令,另一方面它可以可以执行执行脚本文件。

一个简单的示例程序如下(注:可以在VS中编写CSX文件,VS2017就已经有语法高亮和智能提示支持了)

//hello .csxusing System;var msg = "Hello";
Console.WriteLine(msg);

执行指令如下: csi hello.csx

这样,我们就可以像脚本语言那样加载我们的C#程序了

另外,关于C# Script语法,基本上和C#差不多,主要多了如下两个:

  • #load 用来加载别的脚本文件

  • #r 用来加载dll

例如

#load "setup.csx"#r "nunit.core.dll"#r "nunit.core.interfaces.dll"

我还没有找到官方的文档(谁知道的话请告知),有一些第三方文档可以参考下:Writing a script

C# Scripting API

更进一步的,我们可以把脚本程序动态集成到我们的应用程序中,此时就要用到C# Scripting API了。要使用C# Script API,首先需要.net framework 4.6或.net core 1.0以上环境。

然后安装Nuget程序包:Install-Package Microsoft.CodeAnalysis.CSharp.Scripting

首先来个简单的计算:

object result = await CSharpScript.EvaluateAsync("1 + 2");int result = await CSharpScript.EvaluateAsync<int>("1 + 2");

异常处理也是可以的:

try{Console.WriteLine(await CSharpScript.EvaluateAsync("2+2"));
}catch (CompilationErrorException e)
{Console.WriteLine(string.Join(Environment.NewLine, e.Diagnostics));
}

带上下文状态执行:

var state = await CSharpScript.RunAsync("int x = 1;");
state = await state.ContinueWithAsync("int y = 2;");
state = await state.ContinueWithAsync("x+y");
Console.WriteLine(state.ReturnValue);

添加程序集引用:

var result = await CSharpScript.EvaluateAsync("System.Net.Dns.GetHostName()",
ScriptOptions.Default.WithReferences(typeof(System.Net.Dns).Assembly));

添加using导入

var result = await CSharpScript.EvaluateAsync("Sqrt(2)",
ScriptOptions.Default.WithImports("System.Math"));

和宿主程序中的对象交互:

public class Globals
{    public int X;    public int Y;
}var globals = new Globals { X = 1, Y = 2 };
Console.WriteLine(await CSharpScript.EvaluateAsync<int>("X+Y", globals: globals));

作为脚本重复执行:

var script = CSharpScript.Create<int>("X*Y", globalsType: typeof(Globals));
script.Compile();for (int i = 0; i < 10; i++)
{Console.WriteLine((await script.RunAsync(new Globals { X = i, Y = i })).ReturnValue);
}

脚本也可以携带上下文状态:

var script = CSharpScript.Create<int>("int x = 1;").ContinueWith("int y = 2;").ContinueWith("x + y");Console.WriteLine((await script.RunAsync()).ReturnValue);

当然除了Roslyn外,也有一些第三方的脚本解决方案,使用时也可以参考一下。

  • Nake (.Net Framework & Mono)

  • dotnet script (.NET Core)

  • ScriptCS

参考文章:

  • https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples

  • https://msdn.microsoft.com/en-us/magazine/mt614271.aspx

  • http://gsferreira.com/archive/2016/02/the-shining-new-csharp-scripting-api/

原文地址:http://www.cnblogs.com/TianFang/p/6939723.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

通过Roslyn构建自己的C#脚本(更新版)相关推荐

  1. python和shell哪个快_有没有可能让这个shell脚本更快?

    我的任务是创建一个以一个巨大的文本文件作为输入的脚本.然后它需要找到所有单词和出现的次数,并创建一个新文件,每行显示一个唯一的单词及其出现的次数.在 以包含以下内容的文件为例:Lorem ipsum ...

  2. 计算机基础pdf脚本之家,使用脚本管理Windows网络(更新版).pdf

    使用脚本管理 Windows 网络(更新版) 使用脚本管理 Windows 网络 从 WindowsN 学习如何自动化日常管理任务并根据这个来自于的技巧 管理你的网络. 一个流行的关于教授人知识的谚语 ...

  3. 工具推荐:22款最流行的计算机取证工具【2017年更新版】

    本文讲的是工具推荐:22款最流行的计算机取证工具[2017年更新版], 什么是计算机取证? 计算机取证(Computer Forensics,又名计算机取证技术.计算机鉴识.计算机法医学)是指运用计算 ...

  4. 分享平时工作中那些给力的shell命令(更新版)

    分享平时工作中那些给力的shell命令(更新版) 分享平时工作中那些给力的shell命令---(Notice: 蓝色部分为在网友孤风颠影基础上新增加内容) 原帖地址为:http://yunhaozou ...

  5. 【2022HVV系列】蓝队手册更新版(建议收藏)

    本文首发于[2022HVV系列]蓝队手册更新版(建议收藏) 综合篇 青藤云安全出品: 倒计时!你需要这份<2022攻防演练蓝队防守指南> 攻防演练合集 | 3个阶段,4大要点,蓝队防守全流 ...

  6. WPS 2019 更新版(8392)发布,搭配优麒麟 19.04 运行更奇妙!

    WPS 2019 支持全新的外观界面.目录更新.方框打勾.智能填充.内置浏览器.窗口拆组.个人中心等功能.特别是全新的新建页面,让你可以整合最近打开的文档.本地模版.公文模版.在线模板等. 随着优麒麟 ...

  7. 济南计算机中考分数,【更新版】2017济南各初中中考成绩汇总!

    原标题:[更新版]2017济南各初中中考成绩汇总! 据悉:17年全市初三学考报名58443人(不含推荐生3304人),比去年少2529人.今年中考550分以上的考生累计人数为57人.这一人数远远超过去 ...

  8. 更新版-梳理前端开发使用eslint和prettier来检查和格式化代码问题

    更新版,之前的版本可以看这里:梳理前端开发使用eslint和prettier来检查和格式化代码问题 一.问题痛点 在团队的项目开发过程中,代码维护所占的时间比重往往大于新功能的开发.因此编写符合团队编 ...

  9. 附5、MDT 2013 Update 1批量部署-更新版无法修改共享文件夹参数的解决办法

    MDT 2013 UPDATE 1更新版也可以全新安装,安装非常顺利,但是在修改共享文件夹时会提示无法确认的提示,详见下图: 起初还以为是新版的BUG,通过对文档的阅读,原来是MDT 2013 UPD ...

最新文章

  1. grub rescue 安装linux,Ubuntu重装启动失败进入修复grub rescue模式
  2. $.ajax() 方法的理解
  3. 运维经理的运维经验总结
  4. ADO学习(十)DataGrid控件的使用
  5. mysql查询的时候会涉及到锁_Mysql 查询 锁的问题?
  6. 高中上不上分数低学计算机,为什么到了高中,你的学习越来越差,越补越差?终于找到原因了...
  7. Merry Christmas!看甜点海报如何庆祝圣诞
  8. 三大执业考试爆泄题丑闻 部分助考机构成泄题中介
  9. 高通AR系列与MTK芯片对比专业详解
  10. matlab转置的问题
  11. 程序员英文面试题及回答(带中文翻译)
  12. 全新AIY Edge TPU开发板惊艳亮相,今秋发布!
  13. C/C++二维数组传参
  14. 如何用无桥图腾柱功率因数校正控制器实现出色的AC-DC功率转换效率
  15. 操作系统中的故障恢复控制台意义非凡
  16. SDRAM中数据掩码的作用(DQM)
  17. 关于switch的一些理解
  18. ElasticSearch 7.x 入门与实战
  19. 【OpenCV】IPCamera读取网络摄像头实时画面
  20. PhotoshopCS6

热门文章

  1. thinkphp 3.2 unionall
  2. 关于产品推荐的10个问题
  3. [Windows]_[0基础]_[使用命令行工具dumpbin分析文件]
  4. 在zabbix中添加监控主机及Items
  5. [文摘]标准的软件开发过程
  6. MAUI 跨平台播客应用程序(Conf 2021)
  7. 还在做互联网创业梦?醒醒!
  8. 新版 C# 高效率编程指南
  9. api接口返回动态的json格式?我太难了,尝试一下 linq to json
  10. 温故知新:Docker基础知识知多少?