在C#中实现脚本语言

4
我们有一个项目,需要让第三方开发人员创建自己的GUI / CodeBehind驱动程序。我们的GUI运行在WPF上。
现在,我们有很多可能性可以做到这一点,但我们正在考虑的其中之一是创建某种子Xaml XSD,以使用标记语言(不知道它是否会是XAML或我们自己的XML“语言”)让他们创建他们的GUI,然后让他们通过脚本语言进行代码编写。
我想了想,这个模型似乎与《魔兽世界》让人们创建自己的GUI的方式有很多相似之处。WoW的方式是通过实现LUA脚本语言,然后公开一些他们自己的API调用。我们想要类似的行为。
然而,我们有一个比较严格的截止日期,这个实现并不是我们最优先考虑的事项。因此,我正在寻找一个符合.Net标准的脚本解析器/“编译器”,用于我们的项目。我们使用哪种脚本语言并不是主要问题,我们只是想能够快速实现它,而不会出现太多麻烦。
有人知道这种库吗?或者你们有更聪明的解决方案来满足这些要求吗?
显然,我们梦想着创建自己的WYSIWYG编辑器和自己的领域特定语言,但这对我们来说似乎过于复杂。我们只想要一个脚本语言,它除了通过我们的API进行调用之外什么都不能做,同时让第三方开发人员使用条件、循环、也许是面向对象等。
提前感谢:)
7个回答

15

您可以使用IronPython作为您的脚本语言。这里有一篇文章,它介绍了如何基本地使用IronPython。


赞同;没必要重新发明轮子。 - Marc Gravell
3
我成功地使用IronPython在我参与的一款教育游戏中嵌入了Python脚本。它可以很好地与C#集成,只需进行少量编码,即可限制Python可以访问的API。 - zarzych
听起来像是我能想到的最好的解决方案。在接受它作为答案之前,我会再给它一点时间 :) 你能在没有 .Net 4.0 的情况下使用 DLR 吗?我猜我得使用一些“betaish”的库? - cwap
你不需要 .Net 4.0。最新版本的IronPython可以很好地与.NET 2.0配合使用。 - Vadim
哦,太好了。- 但是ScriptEngine、ScriptScope等不是.Net 4.0的类吗? - cwap
ScriptEngine和ScriptScope是随IronPython一起提供的Microsoft.Scripting.dll的一部分。 - Vadim

4

看起来很有趣,但我们不希望用户能够调用我们的API未公开的功能。仅仅从首页上看,他们使用了MessageBox.Show(),而这正是我们希望避免的。我们想要定义哪些方法可以被调用(当然不包括用户自行创建的),例如“OurApi.ShowMessageBox("Hello world");”。 - cwap

4

Lua加上LuaInterface是我们当前项目的选择 - 只需使用LuaInterfcae注册API中的方法,即可从脚本代码中调用它们。我们的用户界面使用ScintillaScintillaNET作为脚本编辑器。

这可能不是构建复杂用户界面的最佳解决方案,但是它是可行的。


有类似的问题,这听起来非常有趣! - Marcel

3
我非常赞同。发明新的通用“编写一堆控制流和对象模型调用”的语言,在我的团队中得到了“减少一千分”的评价;也就是说,这样做的成本非常高,而让我们的客户学习一门新语言的成本也非常高,因此必须至少有“一千分”的好处才能摆脱负面领域。有很多脚本语言,你不需要设计、指定、开发、测试、调试、文档化、发布、维护和教导你的客户如何使用;你可以避免所有这些成本。
如果我站在你的立场上,只有当一门新语言与其他所有语言非常不同,由于它对特定领域具有特殊的适用性,我才会开发它。听起来你已经在开发静态标记DSL方面取得了很大进展,这是个好主意。通过将其作为现有标签结构语言的子集,你不必承担构建解析器、词法验证器等负担。

1

你有没有考虑用Boo创建DSL呢?

开始时它不必非常困难和复杂,但如果以后有更多时间,你可以获得扩展DSL的绝佳选择。


1

Antlr 是一个词法分析器/语法分析器生成器。它比仅仅使用Iron Python要复杂一些,但是你可以很容易地创建自己的DSL,只允许你想要的操作类型。

通过生成的解析器/词法分析器,您可以将其用作实时解释语言或传统的静态编译,或者使用它生成C#代码,然后进行编译。

选项几乎是无限的。


0
也许你对重新发明轮子感兴趣,或者想更好地了解如何使用C#编写自己的编程语言工具,请参阅CodeProject.com上的使用C#实现编程语言

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接