通过Roslyn构建自己的C#脚本(更新版)(转)

?

http://www.cnblogs.com/TianFang/p/6939723.html

?

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

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

C# Interactive窗口

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

????

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

?
?

C#命令行接口

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

????

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

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

//hello .csx

using 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外,也有一些第三方的脚本解决方案,使用时也可以参考一下。

?
?

参考文章:

时间: 2025-01-01 23:58:21

通过Roslyn构建自己的C#脚本(更新版)(转)的相关文章

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

之前写过文章介绍过如何通过Roslyn构建自己的C#脚本,但那篇文章是参考自Roslyn CTP版的,记得本来想等到Roslyn正式版出来重新更新一下文档的,不过记得后来Roslyn是跳票了的,Scripting API在正式版本中都一度被移除了,这个更新就没有做下去了. 最近看到有人在原文中询问如何使用C# Script API,便查询了一下相关资料,这个功能是在的VS2015 update 1中才正式放出的,其时已经到16年了,使用方法与之前已经大有不同了,便重新写一篇介绍下如何使用C# S

通过Roslyn构建自己的C#脚本

通过Roslyn构建自己的C#脚本 在下一代的C#中,一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为一种可在代码中调用的服务.最近使用了一下微软放出的Project Roslyn CTP版,感觉还是非常强大的. 要在自己的代码中执行C#脚本,首先进行如下几步准备工作. 在微软的网站下载Roslyn CTP版并安装 在工程中添加Roslyn.Compilers.dll和Roslyn.Compilers.CSharp.dll的引用 在代码

PowerShell AD用户密码过期脚本更新版

越接触PowerShell感觉越喜欢这门脚本语言,简单易懂,功能强大,操作也方便,同时得益于微软的鼎力支持,在不同的微软产品平台都可以使用,如果想研究微软这方面的东西,会点PowerShell绝对是好处多多. 之前也写了一些关于PowerShell的文章,也相当于是自己不断摸索的过程,最近也陆陆续续写了一些脚本,有一些是工作环境里使用的,没办法拿出来分享,有一些是不同环境里都可以使用的,所以决定拿出来分享一下,脚本都很简单,写的也绝对算不上专业,只是基本的功能可以实现. 今天和大家分享的是写的一

10个工具让你的 shell 脚本更强大

10个工具让你的 shell 脚本更强大 很多人误以为shell脚本只能在命令行下使用.其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等.你可以控制最终的输出,光标位 置还有各种输出效果.下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本.我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的. 1. notify-send 命令 这个命令可以让你通过通知进程发送一个桌面通知给用户.这可以用来向

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

MDT 2013 UPDATE 1更新版也可以全新安装,安装非常顺利,但是在修改共享文件夹时会提示无法确认的提示,详见下图: 起初还以为是新版的BUG,通过对文档的阅读,原来是MDT 2013 UPDATE 1更新版没有设置其他对共享文件夹的读取或读写,解决办法非常简单 一.计算机管理 选择共享文件夹共享 二.选共享文件夹的属性,只有建立者采用读写权限 三.共享权限加入需要读取或读写的系统用户,这里选administrator 由于是测试环境,需要抓取镜像等操作,所以加入的用户名需要完全控制的权

微软公布Win10“发布预览”新规:一周年更新版是新基准

微软Windows Insider预览体验计划包含三个通道,分别是快.慢和发布预览,其中前两个通道可以接收全新开发版本,区别在于快速版更新频繁,功能新颖,慢速版只推送较稳定的版本,新颖程度稍差,而"发布预览"版则是在当前正式版基础上,接收该版本的测试版补丁,并没有功能更新,相对更加稳定. 现在微软发公告称"发布预览"通道即将进入Win10一周年更新版阶段,这将是该通道接收测试版更新的全新基准,而此前该通道的基准为2015年11月发布的1511(10586)版.投注网

(转载)Windows 7 Ultimate(旗舰版)SP1 32/64位官方原版下载(2011年5月12日更新版)

MSDN于2011年5月12日,最新发布简体中文Windows 7 Ultimate 旗舰版 SP1 DVD镜像安装包,分32位和64位两个版本.最新发行代号分别是:677486(32位),677408(64位). 如果您的计算机不符合以上最低配置要求,建议您更新您的计算机配置. ◆ Windows 7 Ultimate sp1 32位(Win 7 旗舰版 SP1)5月12日更新版 官方校验信息: (1)名称:cn_windows_7_ultimate_with_sp1_x86_dvd_u_67

Win10一周年更新版系统CLSID(GUID)大全

Win10系统的CLSID,也就是GUID,这是区分每个组件的唯一识别码,在注册表中可以查到.这些内容对于一般用户来说可以用来直接进入某个组件,或者创建快捷方式等.现在win10专业版官网整理出Windows10一周年更新版的部分组件CLSID,供大家参考. CLSID大全: 添加网络位置 shell:::{D4480A50-BA28-11d1-8E75-00C04FA31A86} 管理工具 shell:::{D20EA4E1-3957-11d2-A40B-0C5020524153} 所有控制面

linux命令学习笔记-持续更新版

shell 获取前一条命令是否执行成功 if [ $? -eq 0 ];then   echo "success" fi linux命令学习笔记-持续更新版