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