【问题标题】:Implementing a scripting language in C#在 C# 中实现脚本语言
【发布时间】:2010-11-26 12:32:06
【问题描述】:

我们有一个项目,我们应该让第 3 方开发人员创建他们自己的 GUI/CodeBehind 驱动程序。我们的 GUI 在 WPF 上运行。

现在,我们有很多这样做的可能性,但我们正在考虑的事情之一是创建某种子 Xaml XSD 来让使用标记创建他们的 GUI(不知道它是否会是 XAML或我们自己的 XML-“语言”,然后让他们通过脚本语言进行代码隐藏。

我想了想,这个模型似乎与魔兽世界让人们创建自己的GUI的方式有很多相似之处。 WoW 的做法是实现 LUA 脚本语言,然后公开一些他们自己的 API 调用。我们想要类似的行为。

但是,我们处于某种严格的截止日期,而这种实施并不是我们的首要任务。因此,我正在寻找一个符合 .Net 的脚本解析器/“编译器”,以便在我们的项目中使用。我们使用哪种脚本语言不是主要问题,我们只是希望能够相当快地实现它,而没有太多的模糊。

有人知道这种图书馆吗?或者你们有针对这些要求的更智能的解决方案吗?

显然,我们梦想着创建自己的所见即所得编辑器和我们自己的领域特定语言,但这对我们来说似乎有点过头了。我们只想要一种脚本语言,它只能通过我们的 API 进行调用,同时让第 3 方开发人员使用条件、循环,也许是 OO 等。

提前致谢:)

【问题讨论】:

    标签: c# .net wpf scripting


    【解决方案1】:

    你看过CSScript吗?

    【讨论】:

    • 看起来很有趣,但我们不希望人们能够做我们的 API 未公开的事情。只需查看首页,他们就会执行 MessageBox.Show(),这是我们想要避免的那种事情。我们要定义可以调用哪些方法(显然它们不是自己创建的),例如“OurApi.ShowMessageBox("Hello world");”
    【解决方案2】:

    您可以使用 IronPython 作为脚本语言。这是article that gives a basic idea 的方法。

    【讨论】:

    • 第二;无需重新发明轮子。
    • 我已经成功地使用 IronPython 将 Python 脚本嵌入到我参与的教育游戏中。它与 c# 很好地集成,并且通过一些编码,您可以限制 Python 可用的 api。
    • 听起来像是我脑海中最好的解决方案。在我接受它作为答案之前,我会再给它一点时间 :) 你可以在没有 .Net 4.0 的情况下使用 DLR 吗?我想我必须使用一些“betaish”库?
    • 您不需要 .Net 4.0。 IronPython 的最新版本在 .NET 2.0 上运行良好。
    • 哦,太好了。 - 但不是 ScriptEngine、ScriptScope 之类的 .Net 4.0 类吗?
    【解决方案3】:

    您是否考虑过创建DSL in Boo?。

    开始并不一定非常困难和复杂,但如果您以后有更多时间在手上,您将获得扩展 DSL 的绝佳选择。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 遇到类似问题,这听起来很有趣!
      【解决方案5】:

      Antlr 是一个词法分析器/解析器生成器。它比仅使用 Iron Python 更复杂一些,但是,您可以相当轻松地创建自己的 DSL,只允许您想要的操作类型。

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

      选项是无穷无尽的。

      【讨论】:

        【解决方案6】:

        我非常同意。发明新的通用“脚本一堆控制流和对象模型调用”语言对我的团队来说是“减去一千分”;也就是说,这样做的成本如此之高,而我们的客户学习一门新语言的成本如此之高,以至于为了摆脱负面领域,收益至少要“一千分”。有很多脚本语言,您不必设计、指定、开发、测试、调试、记录、发布、维护和教您的客户如何使用;您可以避免所有这些费用。

        如果我站在你的立场上,我只会开发一种新语言,如果它的价值在于它与其他所有语言都非常不同,因为它对特定领域的特殊用途适用性。听起来您正在开发静态标记 DSL,这是一个好主意。通过使其成为现有标签结构语言的子集,您不必承担构建解析器和词法验证器等负担。

        【讨论】:

          【解决方案7】:

          也许您有兴趣重新发明轮子,或者想更好地了解如何用 C# 编写自己的编程语言工具,请参阅 CodeProject.com 上的Implementing Programming Languages using C#

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-22
            • 2010-11-12
            • 1970-01-01
            • 2010-12-03
            • 1970-01-01
            • 1970-01-01
            • 2012-06-07
            • 2011-05-09
            相关资源
            最近更新 更多