c# - 使用 IronPython 简化为 C# 应用程序编写的 DSL

标签 c# .net ironpython dsl

感谢 previous question 的建议,我正忙于尝试 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 编写编译器。

最佳答案

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

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

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

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

关于c# - 使用 IronPython 简化为 C# 应用程序编写的 DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1348188/

相关文章:

将应用程序作为 azure webjob 运行时,C# nuget 包依赖项整合失败

c# DateTime 添加不带扩展方法的属性

.net - 如何判断 win32 应用程序是否使用 .NET 运行时

c# - 如何配置 IronPython.StdLib 2.7.3

c# - Jetbrains Rider 指定运行时构建参数

c# - 在pdf文件中搜索字符串

c# - 在一组时间之间随机 sleep

c# - 在 C# 中替换流中的字符串(不覆盖原始文件)

ironpython - 以编程方式设置 Spotfire 图形轴范围

python - 如何包装 C++ 代码以供 IronPython 访问