扩展C#.NET应用程序 - 是否构建自定义脚本语言?

时间:2009-08-24 21:36:06

标签: c# .net scripting ironpython ironruby

我需要为我的C#程序构建脚本接口,对嵌入式固件进行系统级测试。

我的应用程序包含与设备完全交互的库。有单独的库用于启动操作,获取输出和跟踪成功/失败。我的应用程序还有一个GUI,用于管理多个设备并分配许多要运行的脚本。

对于测试人员(非程序员,但是技术人员),我需要提供一个脚本界面,使他们能够提出不同的测试和运行方案。他们只是调用我的API,然后将结果返回给我的程序(通过/失败和消息)。

我想要的一个非常基本的例子:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
IF GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
ELSE
  REPORT_FAIL "Failed to tune to " + frequency
ENDIF
TURN_POWER_OFF

报告,电源和频率功能由我的C#库提供。

像IronRuby或IronPython这样的东西会对此有好处,还是我应该建立自己的基本语言?

在尝试包含一堆.NET编译的程序集时,Ruby / Python代码是否变得混乱?我希望它对于非程序员和程序员来说都很容易学习和编写代码。

编辑:

感谢所有出色的回复。我选择IronPython作为答案,因为它得到了最多的支持,但我会花一点时间与IronPython,Boo和IronRuby分别看看测试人员更喜欢编写脚本。

9 个答案:

答案 0 :(得分:16)

对于完全这种情况,我听说过关于IronPython的非常好的事情。我当然冒险花几个小时快速进行概念验证,看看它是如何实现的。

Michael Foord很乐意在类似的情况下(特别是对于他,对于电子表格精明的用户)讽刺IronPython的成功,并且his book涵盖了(IIRC)关于从.NET托管它的一些指示。 / p>

答案 1 :(得分:10)

您可能希望查看另一种在CLR上运行的托管语言Boo,它特别适合构建DSL并使您的应用程序可编写脚本。

编译管道可以直接从语言本身扩展。

如果您想了解更多信息,请阅读Boo Manifesto是一个很好的起点。

[编辑]我忘了提到Ayende Rahien正在写一本关于这个主题的完整书: Building Domain Specific Languages in Boo

答案 2 :(得分:4)

对于这类任务,可能值得考虑使用PowerShell。这可以像任何DLR语言一样调用.Net,并且在其cmdlet(命令 - 释放)概念中具有更自然的语言类型块。您必须使用编译语言在v1中编写cmdlet - 在v2中从Win7开始推出并在接下来的几个月中使用旧版本(v2 for Vista / Win2k8现在在RC),你可以构建那些在PowerShell中直接使用。

答案 3 :(得分:2)

我同意Marc G,但值得一提的是,一般概念是领域特定的语言。虽然IronRuby / IronPython并非严格针对特定领域,但它们功能齐全,可让您继续实施。

Visual Studio有DSL工具,你可以查看“M”语法。

但是,IronPython。

答案 4 :(得分:2)

从你想要的DSL,我建议使用CUCUMBER和IronRuby。

使用Cucumber,测试人员会编写看起来像这样的测试:

Scenario: See all vendors
Given I am logged in as a user in the administrator role
And There are 3 vendors
When I go to the manage vendors page
Then I should see the first 3 vendor names

使这种语言非常适合您的需求。 只需谷歌“黄瓜和IronRuby”,你会找到几个指南和博客文章,以帮助你开始。

答案 5 :(得分:2)

我们正在使用嵌入式Iron Python在我们的某个项目中定价公式。这是一个关于它的样子的真实样本。

E_DOCUMENT_CHECK = DCPAV * ADS_NUM
E_SPECIFIC_TAX = STV
E_RESOURCE_DEV = RDV
E_LP_ISSUANCE = LPIV
E_ANNUAL_FEES = APFCV * SA * SIDES_NUM
E_SERVICE_FEES= MAX(
MINSFV,
E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES)
TOTAL= E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES+E_SERVICE_FEES

实施起来非常简单。例如,Max()函数只是我们导入IronPython引擎的自定义C#方法之一,在配置设置中使用它看起来很自然。

答案 6 :(得分:0)

您可以使用C#本身作为此处所述的脚本语言 CrowsProgramming - Runtime Scripting in .Net

答案 7 :(得分:0)

IronRuby是创建特定于域的语言最强大的,因为它的语法比python更加灵活和宽容(你的用户会把空白搞砸,并被强制()调用方法弄得烦恼。 / p>

您可以在IronRuby中编写示例脚本,它看起来像这样:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
if GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
else
  REPORT_FAIL "Failed to tune to " + frequency
end
TURN_POWER_OFF

以下是我们的测试人员目前用于根据我们的UI编写自动化测试的DSL示例

window = find_window_on_desktop "OurApplication"
logon_button = window.find "Logon"
logon_button.click

list = window.find "ItemList"
list.should have(0).rows

add_button = window.find "Add new item"
add_button.click
list.should have(1).rows

然而,就目前情况而言,IronPython比IronRuby更成熟,性能更好,所以你可能更愿意使用它。

我强烈建议您使用IronPython或IronRuby而不是创建自己的自定义语言...您将节省难以想象的努力量(和错误)

答案 8 :(得分:0)

讽刺在这里也可能是一个很好的候选人。 这是一个为给定图像动态创建动画的示例。

Set camera size: 400 by 300 pixels.
Set camera position: 100, 100.
Move 200 pixels right.
Move 100 pixels up.
Move 250 pixels left.
Move 50 pixels down.

创建这种DSL的教程在这里:Writing Your First Domain Specific Language

这是一个古老的教程,但是作者仍然在这里维护他的库:Github Irony

相关问题