博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过Roslyn构建自己的C#脚本(更新版)(转)
阅读量:5814 次
发布时间:2019-06-18

本文共 2538 字,大约阅读时间需要 8 分钟。

 

 

之前写过文章介绍过如何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外,也有一些第三方的脚本解决方案,使用时也可以参考一下。

  •  (.Net Framework & Mono)
  •  (.NET Core)

   

参考文章:

转载地址:http://lhmbx.baihongyu.com/

你可能感兴趣的文章
狼图腾读后感
查看>>
1月9日学习内容整理:爬虫基本原理
查看>>
安卓中数据库的搭建与使用
查看>>
AT3908 Two Integers
查看>>
渐变色文字
查看>>
C++ 0X 新特性实例(比较常用的) (转)
查看>>
node生成自定义命令(yargs/commander)
查看>>
各种非算法模板
查看>>
node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
查看>>
PIE.NET-SDK插件式二次开发文档
查看>>
如何创建Servlet
查看>>
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
win7 64位+Oracle 11g 64位下使用 PL/SQL Developer 的解决办法
查看>>
BZOJ1997:[HNOI2010]PLANAR——题解
查看>>
BZOJ1014:[JSOI2008]火星人prefix——题解
查看>>
使用Unity3D引擎开发赛车游戏
查看>>
HTML5新手入门指南
查看>>
淘宝NPM镜像cnpm
查看>>
opennebula 开发记录
查看>>
ubuntu 修改hostname
查看>>