【发布时间】:2010-09-12 06:55:31
【问题描述】:
我想在我的应用程序中运行 javascript/Python/Ruby。
我有一个应用程序可以根据用户的定义自动创建流程。该过程是在 C# 中生成的。我想让高级用户能够在预定义的位置注入脚本。这些脚本应该从 C# 进程运行。 例如,创建的流程将有一些活动,在中间应该运行脚本,然后流程像以前一样继续。 是否有从 C# 运行这些脚本的机制?
【问题讨论】:
我想在我的应用程序中运行 javascript/Python/Ruby。
我有一个应用程序可以根据用户的定义自动创建流程。该过程是在 C# 中生成的。我想让高级用户能够在预定义的位置注入脚本。这些脚本应该从 C# 进程运行。 例如,创建的流程将有一些活动,在中间应该运行脚本,然后流程像以前一样继续。 是否有从 C# 运行这些脚本的机制?
【问题讨论】:
微软在 C# 中对 JavaScript 的解决方案之一是ClearScript, 它使用V8,Chrom 浏览器的 JavaScript 引擎。查看其简短的FAQtorial 以获取代码示例。
它具有出色的双向集成 - 迭代器/枚举器、输出参数、可选参数、参数数组、委托、任务/承诺/异步/等待、bigint 等等。
除此之外,我认为最大的特点是它不依赖于 Rosyln 或动态语言运行时。这可能是好是坏 - 好是因为可能有 很多 更少的依赖项(取决于您的项目的目标),不好是因为您需要捆绑原生的、平台相关的 V8 dll。
如果没问题,您就可以享受尖端的 JavaScript / ECMAScript。自 2022 年 2 月起,您在 Chrome 或 98% ES6 上获得的所有内容,以及几个扩展程序。显然,速度与 Chrome 一样快,因此您可以充分利用 Google 和 Microsoft。
【讨论】:
.NET 有一种脚本语言,包括 PowerShell 中的运行时引擎,可以嵌入到任何 .NET 应用程序中。
【讨论】:
很棒的 C# 脚本语言 - Script.Net
【讨论】:
基本上,您有两个问题:如何在生成的代码中定义注入点,以及如何从那里运行 python / ruby / whatev 脚本。
根据您生成流程的方式,一种可能的解决方案是向每个可能的注入点添加一个函数。该函数将检查用户是否将任何脚本与给定点相关联,如果是,则通过调用 IronPython / IronRuby(可选给定参数)来运行脚本。
缺点包括:从脚本到创建的进程的可访问性有限(基本上,只能访问作为参数传递的变量);以及实现限制(IronPython 的当前版本省略了几个基本的系统函数)。
【讨论】:
我最近刚刚完成了这项工作 - 允许在运行时添加 C# 脚本。
一点都不难,还有这篇文章:
http://www.divil.co.uk/net/articles/plugins/scripting.asp
是一个非常有用的细节总结。
【讨论】:
您是否考虑过 Visual Studio for Applications?自 .NET 1.1 以来,我很少听说过它,但它可能值得一看。
【讨论】:
您可以“即时”将 C# 代码编译成内存中的程序集。我认为 IronPython 和 IronRuby 也是可能的。看CodeDomProvider.CreateProvider方法。
如果您需要大量运行脚本,或者如果您的进程运行了很长时间,您可能希望将这些程序集加载到另一个 AppDomain 中。完成脚本后卸载 AppDomain。否则,您无法将它们从内存中删除。这会对您项目中的其他类产生一些影响,因为您必须编组所有调用。
【讨论】:
研究 IronPython 和 IronRuby —— 它们可以让您轻松地与 C# 进行互操作。
【讨论】:
您可以使用 CSharpCodeProvider 类从 C# 应用程序中编译 C# 代码。
如果编译成功,您可以运行通过 CompilerResults 类的 CompiledAssembly 属性返回的结果程序集。
【讨论】: