通过Roslyn构建自己的C#脚本(更新版)
之前寫過文章介紹過如何通過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#脚本(更新版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web前端知识体系精简
- 下一篇: Docker-Compose 一键部署N