2009-08-28 73 views
9

感謝來自previous question的建議,我正忙於嘗試IronPython,IronRuby和Boo爲我的C#應用​​程序創建DSL。由於更大的用戶和知識庫,第一步是IronPython。如果我能在這裏得到一些好的工作,我可以停下來。使用IronPython簡化爲C#應用程序編寫的DSL

這裏是我的問題:

我希望我的IronPython的腳本訪問的功能在一個名爲庫類。現在我可以組裝添加到IronPython的運行時間,並在我創建的範圍內執行該語句導入類:

// load 'ScriptLib' assembly 
Assembly libraryAssembly = Assembly.LoadFile(libraryPath); 
_runtime.LoadAssembly(libraryAssembly); 

// import 'Lib' class from 'ScriptLib' 
ScriptSource imports = _engine.CreateScriptSourceFromString("from ScriptLib import Lib", SourceCodeKind.Statements); 
imports.Execute(_scope); 

// run .py script: 
ScriptSource script = _engine.CreateScriptSourceFromFile(scriptPath); 
script.Execute(_scope); 

如果我想運行庫:: PrintHello,這僅僅是一個Hello World風格聲明,我的Python腳本包含:

Lib.PrintHello() 

或者(如果它不是靜態的):

library = new Lib() 
library.PrintHello() 

我怎樣才能改變我的環境,這樣我就可以有基本的statments像THI的Python腳本s:

PrintHello 
TurnOnPower 
VerifyFrequency 
TurnOffPower 
etc... 

我希望這些腳本對非編程人員來說很簡單。我不希望他們必須知道什麼是課堂或課程是如何運作的。 IronPython實際上就在那裏,所以像一些基本的操作,如果和一個基本的函數定義不需要我爲我的DSL編寫編譯器。

+0

它在IronRuby的,我不得不寫 腳本庫:: Lib.PrintHello看起來更加醜陋() 是任何人都熟悉或者IronRuby的或IronPython的這種方式?在運行測試腳本之前,我需要一個python安裝腳本來映射所有方法/變量嗎?我曾希望在C#中做到這一點。 – cgyDeveloper 2009-08-28 21:20:22

回答

19

你應該能夠做這樣的事情:

var objOps = _engine.Operations; 
var lib = new Lib(); 

foreach (string memberName in objOps.GetMemberNames(lib)) { 
    _scope.SetVariable(memberName, objOps.GetMember(lib, memberName)); 
} 

這將讓所有的成員從LIB objec,然後將其注入到ScriptScope。這是通過Python ObjectOperations類完成的,因此您下車的成員將是Python成員。所以,如果你再做一些類似的W/IronRuby,相同的代碼應該基本上工作。

+1

謝謝!我希望我能得到多個回覆票,我找不到一種方法將函數放到任何地方。 – cgyDeveloper 2009-08-31 14:43:08

+0

看起來這可能不適用於IronRuby。我認爲它不支持未綁定的成員。我現在可以得到的最好是lib.PrintHello。 – cgyDeveloper 2009-08-31 15:57:25

+1

@cygDeveloper不用擔心我已經爲答案增加了一個額外的贊成票,它肯定是要走的路,我們也以這種方式爲我們的應用程序創建了一個DSL – TimothyP 2011-02-02 00:34:46

相關問題