在C#中运行脚本

时间:2020-03-06 14:35:05  来源:igfitidea点击:

我想在我的应用程序中运行javascript / Python / Ruby。

我有一个可以根据用户的定义自动创建流程的应用程序。该过程在C#中生成。我想让高级用户将脚本注入到预定义的位置。这些脚本应从Cprocess运行。
例如,创建的过程将有一些活动,并且应该在中间运行脚本,然后该过程将像以前一样继续进行。
是否存在从C#运行这些脚本的机制?

解决方案

我们可以使用CSharpCodeProvider类从C应用程序中编译Ccode。

如果编译成功,则可以运行通过CompilerResults类的CompiledAssembly属性返回的结果程序集。

研究IronPython和IronRuby-这些将使我们可以轻松地与C#进行互操作。

我们可以"即时"将Ccode编译为内存中的程序集。我认为IronPython和IronRuby也是可能的。查看CodeDomProvider.CreateProvider方法。

如果我们需要大量运行脚本,或者进程运行了很长时间,则可能需要将这些程序集加载到另一个AppDomain中。完成脚本后,卸载AppDomain。否则,我们将无法从内存中删除它们。这对项目中的其他类有一些后果,因为我们必须整理所有调用。

我们是否考虑过Visual Studio for Applications?自.NET 1.1以来,我还没有听到太多有关它的信息,但是它可能值得一看。

http://msdn.microsoft.com/en-us/library/ms974548.aspx

我刚刚在最近允许运行时添加Cscript的情况下完成了此操作。

一点都不难,本文:

http://www.divil.co.uk/net/articles/plugins/scripting.asp

是详细信息的非常有用的摘要。

基本上,我们有两个问题:如何在生成的代码中定义注入点,以及如何从那里运行python / ruby​​ / whatev脚本。

根据生成过程的方式,一种可能的解决方案是向每个可能的注入点添加一个功能。该函数将检查用户是否已将任何脚本与给定点相关联,如果是,则通过调用IronPython / IronRuby(具有可选的给定参数)来运行脚本。

缺点包括:从脚本到创建的进程的访问性有限(基本上,只能访问作为参数传递的变量);以及实现限制(IronPython的当前版本省略了几个基本系统功能)。

很棒的脚本语言Script.Net

.NET具有脚本语言,包括PowerShell中的运行时引擎,该脚本语言可以嵌入任何.NET应用程序中。