通過Roslyn構建自己的C 指令碼(更新版)

2021-09-08 12:55:38 字數 3042 閱讀 6579

之前寫過文章介紹過如何通過roslyn構建自己的c#指令碼,但那篇文章是參考自roslyn ctp版的,記得本來想等到roslyn正式版出來重新更新一下文件的,不過記得後來roslyn是跳票了的,scripting api在正式版本中都一度被移除了,這個更新就沒有做下去了。

最近看到有人在原文中詢問如何使用c# script api,便查詢了一下相關資料,這個功能是在的vs2015 update 1中才正式放出的,其時已經到16年了,使用方法與之前已經大有不同了,便重新寫一篇介紹下如何使用c# script。

微軟在visual studio中已經提供了乙個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 "

setup.csx

"#r

"nunit.core.dll

"#r

"nunit.core.inte***ces.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("

1 + 2

");

異常處理也是可以的:

try

catch

(compilationerrorexception e)

帶上下文狀態執行:

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

var globals = new globals ;

console.writeline(

await csharpscript.evaluateasync("

x+y", globals: globals));

作為指令碼重複執行:

var script = csharpscript.create("

x*y", globalstype: typeof

(globals));

script.compile();

for (int i = 0; i < 10; i++)

)).returnvalue);

}

指令碼也可以攜帶上下文狀態:

var script = csharpscript.create("

int x = 1;").

continuewith(

"int y = 2;").

continuewith(

"x + y");

console.writeline((

await script.runasync()).returnvalue);

當然除了roslyn外,也有一些第三方的指令碼解決方案,使用時也可以參考一下。

通過Roslyn構建自己的C 指令碼

注意 本文編寫時參考自roslyn ctp版,roslyn script api在正式版本中i形式是有所改變的,請移步檢視這篇文章 通過roslyn構建自己的c 指令碼 更新版 在下一代的c 中,乙個重要的特性就是 compiler as a service 簡單的講,就是就是將編譯器開放為一種可在...

通過Roslyn構建自己的C 指令碼

在下一代的c 中,乙個重要的特性就是 compiler as a service 簡單的講,就是就是將編譯器開放為一種可在 中呼叫的服務。最近使用了一下微軟放出的project roslyn ctp版,感覺還是非常強大的。要在自己的 中執行c 指令碼,首先進行如下幾步準備工作。在工程中新增rosly...

構建自己的映象

參考鏈結 tensorflow tensorflow僅支援py2.7所以需要構建自己的基於py3.5的tensorflow映象 1查詢ubuntu映象,建立容器 nvidia docker search ubuntu nvidia docker run it d name myimage ubunt...