感谢上一个问题的建议,我正忙于尝试 IronPython、IronRuby 和 Boo 来为我的 C# 应用程序创建 DSL。第一步是 IronPython,因为它拥有更大的用户和知识库。如果我能在这里得到一些很好的工作,我可以停下来。
这是我的问题:
我希望我的 IronPython 脚本能够访问名为 Lib 的类中的函数。现在我可以将程序集添加到 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);
如果我想运行 Lib::PrintHello,它只是一个 hello world 风格的语句,我的 Python 脚本包含:
Lib.PrintHello()
或(如果它不是静态的):
library = new Lib()
library.PrintHello()
如何更改我的环境,以便我可以在 Python 脚本中使用基本语句,如下所示:
PrintHello
TurnOnPower
VerifyFrequency
TurnOffPower
etc...
我希望这些脚本对于非程序员来说很简单。我不希望他们知道什么是类或它是如何工作的。IronPython 确实就在那里,因此一些基本操作(如 for、do、if 和基本函数定义)不需要我为我的 DSL 编写编译器。