注意: 本文編寫時參考自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...