日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發(fā)布時(shí)間:2023/12/4 C# 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过Roslyn构建自己的C#脚本(更新版) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前寫過文章介紹過如何通過Roslyn構(gòu)建自己的C#腳本,但那篇文章是參考自Roslyn CTP版的,記得本來想等到Roslyn正式版出來重新更新一下文檔的,不過記得后來Roslyn是跳票了的,Scripting API在正式版本中都一度被移除了,這個(gè)更新就沒有做下去了。

最近看到有人在原文中詢問如何使用C# Script API,便查詢了一下相關(guān)資料,這個(gè)功能是在的VS2015 update 1中才正式放出的,其時(shí)已經(jīng)到16年了,使用方法與之前已經(jīng)大有不同了,便重新寫一篇。

C# Interactive窗口

微軟在Visual Studio中已經(jīng)提供了一個(gè)C#交互窗口,通過它就可以直接執(zhí)行C# 腳本語句。

????

這個(gè)窗口是非常強(qiáng)大的,支持語法高亮,智能提示,使用起來是非常方便的。簡(jiǎn)單的一些靜態(tài)函數(shù)測(cè)試可以直接在該窗口中進(jìn)行,還是非常方便的。

?

C#命令行接口

C#交互窗口方式雖然很方便,但我們很多時(shí)候是希望腳本程序能脫離VisualStudio單獨(dú)執(zhí)行,此時(shí)我們可以用到的命令行程序csi.exe。

????

一方面csi程序可以以REPL方式執(zhí)行輸入的命令,另一方面它可以可以執(zhí)行執(zhí)行腳本文件。

一個(gè)簡(jiǎn)單的示例程序如下(注:可以在VS中編寫CSX文件,VS2017就已經(jīng)有語法高亮和智能提示支持了)

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

執(zhí)行指令如下: csi hello.csx

這樣,我們就可以像腳本語言那樣加載我們的C#程序了

另外,關(guān)于C# Script語法,基本上和C#差不多,主要多了如下兩個(gè):

  • #load 用來加載別的腳本文件

  • #r 用來加載dll

例如

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

我還沒有找到官方的文檔(誰知道的話請(qǐng)告知),有一些第三方文檔可以參考下:Writing a script

?

C# Scripting API

更進(jìn)一步的,我們可以把腳本程序動(dòng)態(tài)集成到我們的應(yīng)用程序中,此時(shí)就要用到C# Scripting API了。要使用C# Script API,首先需要.net framework 4.6或.net core 1.0以上環(huán)境。

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

首先來個(gè)簡(jiǎn)單的計(jì)算:

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)); }


帶上下文狀態(tài)執(zhí)行:

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導(dǎo)入

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

和宿主程序中的對(duì)象交互:

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));

作為腳本重復(fù)執(zhí)行:

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); }

腳本也可以攜帶上下文狀態(tài):

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

當(dāng)然除了Roslyn外,也有一些第三方的腳本解決方案,使用時(shí)也可以參考一下。

  • 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社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的通过Roslyn构建自己的C#脚本(更新版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。