如何开始为我的.NET应用程序设计和实现脚本界面?

时间:2010-03-08 16:51:46

标签: .net object-model scripting-interface

如何开始为我的.NET应用程序设计和实现脚本界面?

VSTAVBA的.NET等效COM),但据我了解,我必须为每次安装我的应用程序支付许可费。它是一个开源的 应用程序,所以这将无法正常工作。

还有例如嵌入式解释器(IronPython?),但我不明白这将如何允许将“对象模型”(见下文)暴露给外部(或内部)脚本。

子的问题:

  • .NET中的脚本界面故事是什么?在.NET中这样做是否有点微不足道?
  • E.g。可以将我的应用程序中的某些.NET对象及其包含的对象声明为可以在运行时从外部访问吗?
  • 外部 脚本如何访问我的应用程序(通过对象模型)?

背景:

我曾经为Macintosh应用程序设计并实现了一个相当复杂的脚本接口,用于从a mass spectrometer(Mac OS,System 7)获取和分析数据,后来用于Windows应用程序的COM接口。

两者都设计有“对象模型”和类(可以具有属性)。这些是重载的单词,但是 在脚本接口中,上下文对象模型本质上是特定类对象的包含层次结构。类具有属性,包含对象的列表,不仅是数据,还可以包含动词(动作/方法)。例如。在Macintosh情况下,定义的应用程序对象可以包含一个采集对象,该对象具有仪器中使用的电压属性和fireLater动词 - 所有这些都可以从外部脚本中看到。

请注意,在这两种情况下,用于实现应用程序的编程语言中的类/对象与脚本对象模型无关。对于Macintosh的情况,用于实现脚本接口的机制由Apple定义。 Apple还定义了一些如何设计对象模型的标准。例如,类中某些常见属性的标准化名称。

或者类似于在Microsoft Office应用程序中公开的COM接口,其中可以使用应用程序对象添加到其文档列表(具有创建文档的GUI表示的副作用)。

外部脚本可以在容器中创建新对象,并在任何给定时间浏览层次结构的内容。在Macintosh中,案例脚本可以用例如AppleScriptFrontier

在Macintosh上,脚本界面的实现非常复杂。 在Metroworks'C ++类库中支持它(这个名称现在让我失望)使它变得更加简单。

8 个答案:

答案 0 :(得分:13)

看看PowerShell

它允许您编写可编写脚本的简单Cmdlet。它还支持分层容器(默认情况下,您有文件系统,注册表,证书存储等)。

答案 1 :(得分:11)

[编辑:正如本文评论中详细介绍的那样,假设您非常需要启用内部脚本,您可以在其中托管代码段或功能,而某些人则会让您自定义您的应用,而不是纯粹的外部场景。正在提供一个方面,允许人们在更严格的预定义基础上挖掘你的应用程序中的东西]

IronRuby和IronPython非常简洁,适合这一点(但正如另一个答案所说,如果你有更多基础设施类型的话,PowerShell可能是合适的。)

编辑:启用内部脚本的其他想法是

  • 使用Windows Workflow Foundation(向其公开活动和/或托管工作流实例)
  • 使用Spring.NET's Expression Language(简洁,易于教学和学习但功能非常强大)

编辑2011年6月2日:IronJS也可能是合适的候选人,there's a Hanselminutes that talks it thru

答案 2 :(得分:7)

我建议您将动态语言运行时视为实现脚本界面的策略。详细说明:

DLR目前支持IronPythonIronRuby,还可以在CodePlex找到许多其他语言实施。如果您有兴趣创建特定于您的应用程序的语言,Bitwise Magazine有一个很好的入门article

Dino Viehland的PDC09会议Using Dynamic Languages to Build Scriptable Applications值得关注。您可以找到演示代码here

答案 3 :(得分:6)

Lua scripting language是免费的,在大量商业应用程序中使用,并且可以使用免费提供的LuaInterface库轻松嵌入到.NET应用程序中,这允许您公开类型和方法从您的应用程序中,嵌入式解释器中的脚本可以利用。

可以找到有关如何将Lua嵌入C#应用程序的教程here

编辑:可能还值得注意的是,Lua是从头开始设计为嵌入式脚本语言的,因此,解释器是高度可定制的。作为安全模型的一部分,宿主应用程序几乎可以限制解释功能的任何方面;例如允许或阻止脚本建立网络连接或写入文件等。

另外,您询问了外部脚本。使您的程序可用于进程外脚本的方式与将其提供给进程外应用程序的方式相同:通过某种通信协议公开标准化自动化接口。在Windows上,对于同一台机器的跨进程通信,最常见的是COM,但也可能是WCF,TCP远程处理,RPC或任何其他通信标准。您选择做什么在很大程度上取决于您的应用程序的构建方式以及您打算使用哪种外部自动化。

答案 4 :(得分:5)

对于免费,易于实现的.NET脚本语言,请查看C#。

请参阅my answer类似的问题。

至于公开数据,看看它是如何使用.NET语言,您只需要将程序添加到程序集中以链接到相关类并公开相关类。

答案 5 :(得分:5)

我用CS-Script创建了你想要的东西。就我而言,我在我的应用程序中定义了一个接口。然后,脚本只需要实现此接口,以便可以从应用程序运行它。我的应用程序是关于处理扫描图像,因此我的界面看起来像这样:

public interface ICustomModule
{
    void ProcessBatch(IBatch batch)
}

这样我的脚本就可以访问我在应用程序中定义的对象模型(在我的例子中通过IBatch)。好处是在开发期间我可以使用普通的类库项目来执行脚本:IntelliSense,调试......我不记得确切的细节,但我的应用程序中基本上有一个开关,告诉应用程序使用引用类库而不是脚本。

此外,我创建了一个允许配置脚本的附加接口:脚本可以定义一组属性,然后由我的应用程序在属性网格中显示这些属性。我想我使用的是here这个版本,因为当时看起来有点灵活。这样您不仅可以允许用户配置脚本,还可以以描述,选择,默认值的形式提供帮助......属性网格是可扩展的:在一种情况下,我们有一个显示特殊的脚本表单定义一些复杂的设置。

修改 当然应用程序没有引用“debug”类库。它只需要加载程序集......

答案 6 :(得分:4)

我不确定这会满足您的需求,但通过反射,您可以编译C#代码并在运行时执行它(示例代码here)。

所以你可以在例如编写脚本。 C#然后编译“它在运行中”并直接在您的应用程序的上下文中运行它。当然,您必须牢记安全注意事项,但如果脚本受信任,那么它可能对您有用,并且您可以获得为脚本使用强大的托管语言的好处。

如果您需要高性能或运行数千个脚本,它可能会太慢。

答案 7 :(得分:3)

我为我编写的工作流程系统实施了CS-Script作为脚本平台的最后一步。每个需要的wrokflow都有不同的条件,这些条件决定了用户订阅各种任务以及谁将接收电子邮件。使用脚本模型,可以轻松地将新步骤引入工作流程并处理这些任务所需的独特需求。

脚本模型的另一个优点是可以在各种条件下测试工作流,并且可以采用迭代方法来最终确定工作流行为。在质量检查和用户验收测试期间,我在脚本中包含了记录功能,以便我可以更轻松地查找问题。

使用CS-Script,您可以完全访问对象;也就是说,当您的脚本导入程序集时,您可以在脚本代码中实例化对象。此外,您可以保留已编译的脚本并仅为它们提供参数。如果程序集使用参数对象或字典,则可以将脚本和执行方法传递给参数对象中包含的对象。