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

Pet*_*sen 33 .net object-model scripting-interface

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

VSTA(的.NET等同VBACOM),但据我了解,我将不得不支付许可费,我的应用程序的每个安装.它是一个开源的应用程序,所以这将无法正常工作.

还有例如嵌入式解释器(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++类库中支持它(这个名字现在让我失望)使它变得更加简单.

Mic*_*tov 13

看看PowerShell.

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

  • @Peter Mortensen:您的应用程序中有公共课程,可以在PS中创建(通过等同于"新"),然后通过以下方式与您正在运行的应用程序进行通信:a)加载应用程序所执行的相同数据 - 并行应用程序子集的实例,它将在PS AppDomain中运行它,即,您以与使用GUI应用程序的命令行版本相同的方式公开应用程序的子集,或者b)将您的应用程序暴露给您通过.NET Remoting等在其AppDomain中的实际应用程序,即,您实现了一个代表您的应用程序的类 - 即,与将您的管理界面暴露给WCF主机的方式相同 (2认同)

Rub*_*ink 11

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

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

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

  • 使用Windows Workflow Foundation(向其公开活动和/或托管工作流实例)
  • 使用Spring.NET的表达式语言(简洁,易于学习和学习但功能非常强大)

编辑2011年6月2日:IronJS也可能是一个合适的候选人,有一个Hanselminutes通过谈话.


Voi*_*ler 7

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

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

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


Dan*_*ory 6

Lua脚本语言是免费的,在大量的商业应用中,并且很容易嵌入到使用可免费获得一个.NET应用程序LuaInterface库,它允许你从暴露你的应用程序类型和方法,在您的嵌入式脚本解释器可以利用.

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

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

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


Gra*_*ers 5

要获得一个免费的,易于实现的.NET脚本语言,请查看C#.

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

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


Ste*_*gli 5

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

public interface ICustomModule
{
    void ProcessBatch(IBatch batch)
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑: 当然应用程序没有引用"debug"类库.它只需要加载程序集......