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

2021-09-08 08:19:52 字數 2227 閱讀 5697

注意: 本文編寫時參考自roslyn ctp版,roslyn script api在正式版本中i形式是有所改變的,請移步檢視這篇文章:通過roslyn構建自己的c#指令碼(更新版)

在下一代的c#中,乙個重要的特性就是"compiler as a service",簡單的講,就是就是將編譯器開放為一種可在**中呼叫的服務。最近使用了一下微軟放出的project roslyn ctp版,感覺還是非常強大的。

要在自己的**中執行c#指令碼,首先進行如下幾步準備工作。

roslyn ctp版並安裝

在工程中新增roslyn.compilers.dll和roslyn.compilers.csharp.dll的引用

在**中增加如下命名空間的引用。

using roslyn.scripting;

using roslyn.scripting.csharp;

經典的helloworld

首先還是以經典的hello world來開始介紹如何執行指令碼吧。

static

void main(string args)

從上述**中可以看出,執行乙個指令碼還是比較簡單的,只要建立乙個scriptengine物件,然後就可以通過scriptengine.execute()函式執行自己的指令碼了。

如果我們要獲取指令碼的返回值,也是很容易的。

var result = scriptengine.execute("3+2*5");

console.writeline(result);

在會話中執行指令碼

很多時候,我們無法一次執行所有的指令碼,而是像shell中那樣輸入一句執行一句的。假如我們執行如下**:

var scriptengine = new

scriptengine();

scriptengine.execute("var i = 3;");

var result = scriptengine.execute("i * 2");

得到的並不是我們想要的結果6,而是乙個異常:(1,1): error cs0103: the name 'i' does not exist in the current context。

究其原因,是因為scriptengine.execute()函式每次都是在乙個單獨的上下文中執行的,並不會和前面的語句產生關聯。如果我們要在scriptengine.execute()函式中新增session引數,以標明其是在同乙個會話中的。正確方式如下:

var scriptengine = new

scriptengine();

var session = session.create();

scriptengine.execute("var i = 3;", session);

var result = scriptengine.execute("i * 2", session);

在指令碼和程式中共享資料

我們在執行指令碼時,除了獲取指令碼的輸出外,許多時候需要設定指令碼的輸入,要設定輸入的方式也有許多。最直接的方式拼接指令碼但這麼做的效率和可維護性是十分差的。另外也可以通過傳統的ipc通訊機制——檔案、socket等方式,這種方式一來比較麻煩,二來對於複雜的物件來說,還牽涉到序列化,也是非常不便。

roslyn提供了乙個更為簡單有效的解決辦法:在會話中傳入乙個宿主物件,會話中的指令碼程式也能訪問宿主物件的各成員變數。

還是舉乙個簡單的例子吧:

namespace host

}class

program

, importednamespaces: new );

var host = new host.hostobject();

var session = session.create(host);

var result = engine.execute("state + state", session);

console.writeline(result);

host.state = "go go hello ";

result = engine.execute("state + state", session);

console.writeline(result);}}

這裡首先建立了乙個hostobject型別的宿主物件host,再由它建立會話。這樣就將host物件的成員變數state嵌入了指令碼中,在指令碼和程式中都能共享state變數了。

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

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

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

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

構建自己的映象

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