C# 如何向应用程序添加可编程性

C# 如何向应用程序添加可编程性,c#,.net,.net-3.5,scripting,C#,.net,.net 3.5,Scripting,我正在编写一个应用程序,它的核心是一个规则引擎。用户希望能够定义自定义规则。其中一些将是相当简单的代数表达式,许多将涉及一些if-then分支逻辑,有些甚至更复杂。我的选择是什么 我的用户非常聪明,精通T-SQL和Excel命令,通常熟悉编程结构,但他们本身不是“程序员” 我考虑过使用VBA/VSTA;以某种方式与Excel进行互操作;集成某种脚本语言(Ruby?Perl?Tcl?);或者我自己滚 在最好的情况下,我将为他们提供一个编辑器,带有颜色编码和类似IntelliSense的交互式帮助,

我正在编写一个应用程序,它的核心是一个规则引擎。用户希望能够定义自定义规则。其中一些将是相当简单的代数表达式,许多将涉及一些if-then分支逻辑,有些甚至更复杂。我的选择是什么

我的用户非常聪明,精通T-SQL和Excel命令,通常熟悉编程结构,但他们本身不是“程序员”

我考虑过使用VBA/VSTA;以某种方式与Excel进行互操作;集成某种脚本语言(Ruby?Perl?Tcl?);或者我自己滚

在最好的情况下,我将为他们提供一个编辑器,带有颜色编码和类似IntelliSense的交互式帮助,一个用于测试和实验的即时执行模式,以及一个分步调试程序。他们还需要能够保存、检索、编辑和执行他们的规则。燃烧的速度不是必需的

我的环境是Windows/.Net 3.5/C#


有什么想法吗?

任何这样的实现都充满了风险。我将从尽可能小的定制集开始,然后从那里逐步建立您的功能


不要试图一次将各种各样的可扩展性编程到它中,除非你已经有很多这样做的技能。每次选择一个简单的功能—运行标准SQL查询并返回G记录集或其他任何功能。

我不是windows用户,因此我的答案并不完全适合您的情况。我建议在应用程序中嵌入一个完整的脚本语言解释器。公开一些原语(例如,规则引擎中您希望公开的部分),然后提供一个完整的解释器。我知道TCL、Python和java都是以这种方式嵌入的。我个人推荐Python,因为Scheme(guile)有点深奥,而且TCL似乎正在逐渐失势

不要发明自己的脚本语言!为单一系统学习一门新语言是不好的。我会尝试使用相对容易学习和理解的Python。

Windows内置了Windows脚本主机引擎,其中有两个用于VBScript和JScript的解释器。你可以很容易地使用它们。只需查看MSDN以获得合适的COM接口。

Lua可能是一个很好的解决方案。我真正想知道的是,将规则引擎与允许用户编写自己规则的脚本语言集成在一起会有多复杂

一个好的方法是将所有内容(也包括规则引擎)嵌入到脚本解释器中,否则最终会编写大量代码,将用户写入脚本的内容与程序中使用的相关规则连接起来


然而,设计这样的可编程性需要非常注意您的语言应该能够做什么,从实用程序的一个小核心开始,然后扩展它;或者,在开始整个实施之前,你可以做很多计划,但根据我的经验(到目前为止,我写了3-4个口译员),更好的方法是在开发过程中进行调整,当然还要考虑用户的反馈:这是必要的,因为你可以假设他们有多好,但是我不会指望它。

对于一个诚实的规则引擎,你可以考虑使用它。Clips是一个开源专家系统,您可以将其嵌入到自己的应用程序中

如果您想要真正的脚本,那么有很多工具可以将脚本添加到使用Lua、TCL、REXX等语言的应用程序中


无论你做什么,你都应该仔细检查许可证。将其他人的代码嵌入到您的代码中通常会对您如何许可生成的程序产生影响。

这并不是您所要求的全部,但我会根据您的需要,调查Boo。在Boo中构建一个对业务人员来说相对可读的DSL相对来说是比较轻松的,这有很大的好处,即使他们不是直接编写规则的人

Oren Eini在Boo中构建特定于领域的语言非常好,刚刚以最终形式发布。规则引擎是他研究的DSL的示例实现之一。Boo是一种完全构建的、类似Python的.Net静态类型语言,拥有一个小型但强大的社区,并且由于可扩展的编译器管道和一个非常好的语义智能宏系统,使得修改语言以满足特定需求比几乎所有其他选择都要容易

Boo的好处在于,大多数dsl只是构建在一个公共基类上,该基类提供了您需要的“语言”,但与您将要编写的硬编码规则的代码没有太大区别。您可以使该语言看起来与您想要的完全一样,但不必担心手动解析或编写控制流命令,也不必担心您希望该语言具有的所有功能


还有一些缺点:它不像Python或Ruby,文档大部分都是Boo的源代码,而且社区很小。但如果你能“以身作则”,你可以走得很远。适用于您的愿望列表的主要警告是代码完成;一些VS插件和SharpDevelop对代码完成的支持有限,但随着DSL的构建,代码完成的功能几乎消失了。

从经验来看,因为我们的主软件具有脚本功能

我们使用作为脚本设计器。我们最初的要求是“用户应该能够为字段编写公式。该公式将用于验证字段的内容。”

从那以后,我们使用了。用户能够编写公式,同时仍然能够添加数学函数和自定义函数。我们当时并不需要更多,但现在看到了使用动态Linq的局限性


如果我们要制作一个新版本的脚本引擎,我们现在将期待使用新的支持DLR的语言:

,因为.NET是您的平台,嵌入ironpy