35

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

VSTA(.NET 相当于VBAfor COM),但据我了解,我必须为每次安装我的应用程序支付许可费。它是一个开源应用程序,所以这不起作用。

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

子问题:

  • .NET 中的脚本接口故事是什么?在 .NET 中执行此操作是否微不足道?
  • 例如,我的应用程序中的某些 .NET 对象及其包含的对象是否可以在运行时声明为可从外部访问?
  • 外部脚本如何访问我的应用程序(通过对象模型)?

背景:

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

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

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

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

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

在 Macintosh 上,脚本接口的实现非常复杂。Metroworks的 C++ 类库对它的支持(这个名字现在让我忘记了)使它变得更加简单。

4

8 回答 8

13

看看PowerShell

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

于 2010-03-08T17:05:12.877 回答
12

[编辑:正如本文的评论中详细介绍的那样,假设您非常需要启用内部脚本,在其中托管有人提供给您自定义应用程序的片段或功能,而不是纯粹的外部场景,即提供外观允许人们在更严格的预定义基础上从您的应用程序中挖掘东西]

IronRuby 和 IronPython 非常简洁且适用于此(但正如另一个答案所说,如果您有更多基础设施类型的东西,PowerShell 可能是合适的)。

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

  • 使用 Windows Workflow Foundation(向它公开活动和/或托管工作流实例)
  • 使用Spring.NET 的表达式语言(简洁、易于文档和学习但令人惊讶的强大)

编辑 2011 年 6 月 2 日: IronJS 也可能是一个合适的候选人,有一个 Hanselminutes 可以通过它进行讨论

于 2010-03-24T13:53:42.660 回答
7

我建议您将动态语言运行时视为实现脚本接口的策略。细节:

DLR 目前支持IronPythonIronRuby,还有一些其他语言实现可以在CodePlex上找到。如果您有兴趣创建特定于您的应用程序的语言 Bitwise 杂志有一篇很好的入门文章

Dino Viehland 的 PDC09 会议使用动态语言构建可编写脚本的应用程序值得一看。您可以在此处找到演示代码。

于 2010-03-29T20:10:18.147 回答
6

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

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

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

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

于 2010-03-31T00:18:28.753 回答
5

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

请参阅对类似问题的回答。

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

于 2010-03-24T11:54:22.607 回答
5

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

public interface ICustomModule
{
    void ProcessBatch(IBatch batch)
}

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

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

编辑: 该应用程序当然没有对“调试”类库的引用。它只需要加载程序集...

于 2010-03-28T09:38:09.887 回答
4

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

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

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

于 2010-03-24T11:46:17.070 回答
3

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

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

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

于 2010-03-30T23:40:18.977 回答