2009-08-28 71 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

相关问题