代码之家  ›  专栏  ›  技术社区  ›  Peter Mortensen icecrime

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

  •  32
  • Peter Mortensen icecrime  · 技术社区  · 15 年前

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

    VSTA (等于.NET VBA 对于 COM ,但据我所知,每次安装我的应用程序都需要支付许可费。它是一个开源的 所以这个应用程序不起作用。

    例如,还嵌入了解释器(ironpython?),但我不明白这将如何允许向外部(或内部)脚本公开“对象模型”(见下文)。

    子问题:

    • .net中的脚本接口故事是什么?在.net中这样做是不是有些琐碎?
    • 例如,我的应用程序中的一些.NET对象及其包含的对象是否可以在运行时声明为可从外部访问?
    • 怎样才能 外部的 脚本(通过对象模型)访问我的应用程序?

    背景:

    我曾经为Macintosh应用程序设计并实现了一个相当复杂的脚本接口,用于从 a mass spectrometer (MAC操作系统, System 7 )以及后来的windows应用程序的com接口。

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

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

    或者类似于microsoft office应用程序中公开的com接口,其中application对象可用于添加到其文档列表中(副作用是创建文档的gui表示)。

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

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

    8 回复  |  直到 6 年前
        1
  •  10
  •   Ruben Bartelink    13 年前

    [编辑:正如本文注释中详细介绍的,假设您需要在托管代码片段或函数的地方启用内部脚本,而不是在纯粹的外部场景中提供facaade以允许用户自定义应用程序,则需要在这些场景中启用内部脚本。在更严格的预定义基础上从你的应用程序中提取内容]

    IronRuby和IronPython非常简洁,适合这种情况(但正如另一个答案所说,如果您有更基础结构类型的东西,那么Powershell可能是合适的)。

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

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

        2
  •  13
  •   Michael Damatov    15 年前

    看一看 PowerShell .

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

        3
  •  7
  •   Peter Mortensen icecrime    13 年前

    我建议你考虑一下 动态语言运行时 作为实现脚本接口的策略。细节:

    DLR目前支持 IronPython IronRuby ,以及许多其他语言实现可以在 CodePlex . 如果您有兴趣创建一种特定于您的应用程序的语言,那么Bitwise Magazine有一本很好的入门书 article .

    迪诺·维兰的pdc09课程 Using Dynamic Languages to Build Scriptable Applications 值得关注。你可以找到演示代码 here .

        4
  •  6
  •   Dan Story    15 年前

    这个 Lua scripting language 是免费的,用于大量的商业应用程序中,并且可以使用免费可用的 LuaInterface 库,它允许您公开应用程序中脚本可以利用的类型和方法。

    关于如何将lua嵌入c应用程序的教程可以找到 here .

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

    还有,你问过 外部的 脚本。使程序对进程外脚本可用的方法与使程序对进程外应用程序可用的方法相同:通过某种通信协议公开标准化的自动化接口。在windows上,对于同一台机器的跨进程通信,最常见的是com,但也可以是wcf、tcp remoting、rpc或任何数量的其他通信标准。您选择做什么在很大程度上取决于您的应用程序是如何构建的,以及您希望它做什么样的外部自动化。

        5
  •  5
  •   Stefan Egli    15 年前

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

    public interface ICustomModule
    {
        void ProcessBatch(IBatch batch)
    }
    

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

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

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

        6
  •  5
  •   Community CDub    7 年前

    免费,易于实现 .NET 脚本语言,看看C。

    my answer 类似的问题。

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

        7
  •  4
  •   axel_c    15 年前

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

    所以您可以用eg.c编写脚本,然后编译“it on the fly”,并直接在应用程序的上下文中运行它。当然,您必须牢记安全考虑,但是如果脚本是可信的,那么它可能对您有用,并且您可以从为脚本使用强大的托管语言中获益。

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

        8
  •  3
  •   David Robbins    15 年前

    我实现了 CS-Script 作为我写的工作流系统的最后一个脚本平台。每个wrokflow需要不同的条件,这些条件决定了哪些用户将订阅不同的任务以及哪些用户将接收电子邮件。使用脚本模型,可以很容易地将新步骤引入到工作流中,并处理这些任务所需的独特需求。

    脚本模型的另一个好的副产品是工作流可以在各种条件下进行测试,并且可以采取迭代的方法来最终确定工作流行为。在qa和用户接受测试期间,我在脚本中包含了一些日志功能,以便更容易地发现问题。

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