10

感谢上一个问题的建议,我正忙于尝试 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 编写编译器。

4

1 回答 1

20

您应该能够执行以下操作:

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

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

这将从 lib 对象中获取所有成员,然后将它们注入 ScriptScope。这是使用 Python ObjectOperations 类完成的,因此您下车的成员将是 Python 成员。因此,如果您随后使用 IronRuby 执行类似的操作,则相同的代码基本上应该可以工作。

于 2009-08-29T00:51:11.653 回答