C#解释器(不含汇编)

是否有一个即时可用的C#解释器,那不依赖于运行时编译?

我的要求是:

  • 一个脚本引擎
  • 必须处理C#语法
  • 必须在中等信任环境下工作
  • 不得使用运行时编译(CodeDomProvider …)
  • 开源(或至less免费为个人和专业使用)

如果不清楚的话,我需要像Jint( http://jint.codeplex.com/ )这样的东西,但是它允许我编写C#脚本而不是JavaScript脚本。

谢谢你的帮助。

你看过paxScript.NET吗?

查看Mono项目。 他们最近演示了CsharpRepl ,这听起来像你之后。 PDC 2008video在这里 。


更新:
仔细看来,使用Mono.CSharp服务来评估脚本似乎是不可能的。 目前它被链接到Mono运行时,他们不希望它运行在一个中等的信任环境。 有关更多信息,请参阅此讨论 。

另一种可能性是在你的项目中包含Mono C#编译器 (源代码),并使用它来生成从文件系统加载的程序集。 你担心加载所有这些程序集所需的资源,你可能需要将它们加载到一个单独的AppDomain中。

LINQPad可以作为代码片段IDE工作。 该应用程序非常小,重量轻。 它是免费的(如啤酒),但不是开源的。 自动完成需要额外的费用($ 19)。

编辑:在阅读了这篇文章的意见后,更仔细一点,我不认为LINQPad是你想要的。 你需要的东西,可以编程dynamic评估数以千计的小脚本,对吗? 我非常容易地使用Iron Ruby来做这个工作。 如果你愿意使用DLR语言,这可能会更可行。 我也做了一些类似的工作,用一些可以评估C#lambdaexpression式作为string传入的代码,但是这是非常有限的。

我需要评估10000多个不同的小脚本,编译所有这些脚本的速度会非常慢

解释这些将会更加痛苦地缓慢。 我们有一个类似的问题,我们解决如下:

我们使用Gold Parser项目parsing源代码并将其转换为基于XML的“通用语言”。 我们通过一个生成VB.Net源代码的转换来运行它(仅仅是因为它不区分大小写)。 然后,我们使用.Net运行时将这些编译成一个独立的DLL,并使用严格限制的访问来调用它。

这听起来好像你正在创build一个dynamic的网站,人们可以创build自定义模块或function片段,但使用C#来做到这一点,引起了一些主要问题; C#必须被编译,唯一的办法是在运行时插入它,这是不可行的,即使你编译每个代码片段,你最终将得到10,000个DLL,这是不切实际和不可用的。

如果你的代码片段很less改变,那么我会考虑以编程方式将它们包装成一组源代码,每个源代码都有一个唯一的名称,然后在一个镜头中编译它们(或者每隔10分钟进行一次定时处理?)。 这是我们所做的,因为它也允许人类会话的“版本化”,所以他们继续使用他们在会话开始时所使用的DLL版本,但是当每个会话停止使用旧版本时,它就被删除了。

如果你的代码片段在一天中定期改变,那么我build议你看一个解释的脚本语言,甚至PHP,并根据你所需要的function混合你的语言。 诸如CScript和LinqPad之类的产品都使用CodeDomProvider,因为如果要编程编译的逻辑,必须将IMSL放在某处。

唯一的select是编写自己的解释器并使用reflection来访问所有需要访问的其他库,但这是非常复杂和可怕的。

由于你的要求是无法实现的,我build议你退后一步,找出一种方法去除一个或多个限制。 无论您是否findFullTrust环境来编译您的代码片段,都不需要完整的代码支持(例如移动到解释的代码片段支持),甚至可以将整个框架更改为非.NET的东西。

我写了一个开源项目Dynamic Expresso ,它可以将使用C#语法编写的文本expression式转换为委托(或expression式树)。 expression式被parsing并转换成expression式树而不使用编译或reflection。

你可以写下如下的东西:

var interpreter = new Interpreter(); var result = interpreter.Eval("8 / 2 + 2"); 

要么

 var interpreter = new Interpreter() .SetVariable("service", new ServiceExample()); string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()"; Lambda parsedExpression = interpreter.Parse(expression, new Parameter("x", typeof(int))); parsedExpression.Invoke(5); 

我的工作基于Scott Gu的文章http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

它不处理确切的C#语法,但是PowerShell与.NET框架很好地融合在一起,并且是如此成熟的产品,我认为至less可以将其视为一种可能的解决scheme是不明智的。 微软推出的大多数服务器产品现在都支持包括Microsoft Exchange和Microsoft SQL Server在内的脚本界面的PowerShell。

我面临同样的问题。 在一个项目中,我希望提供一种通用的方式来指定何时必须生成某个字母的控制条件。 另一个项目的条件是控制如何分配队列的情况。 在他们两个下面的解决scheme完美地工作:

  1. 片段的语言 – 我select了JScript,这样我就不必担心variablestypes。
  2. 汇编 – 是的,它需要充分的信任,但你可以把你的代码在一个单独的大会,并给予充分的信任。 不要忘记用AllowPartiallyTrustedCaller属性来标记它。
  3. 代码片段的数量 – 我将每个代码段作为方法处理,而不是类。 这样可以将多个方法合并为一个程序集
  4. 磁盘使用情况 – 我在内存中进行了所有编译,而不将程序集保存到磁盘。 如果您需要重新加载它也有帮助。

所有这些在生产中都没有任何问题

编辑

只是为了澄清“片段” – 我所说的条件只是布尔expression式。 我编程式地添加额外的文本,把它变成方法和方法来编译类。

我也可以用C#做​​同样的事情,尽pipe我仍然认为JScript对于代码片断来说更好

顺便说一句,我的代码是开源的,随意浏览 。 请记住,这里有很多与此讨论无关的代码。 让我知道如果你需要帮助find有关这个话题的片断

蹦极#是你想要的东西,在短时间内,蹦极将成为一个开源项目

http://www.crssoft.com/Services/Bungee

。 你可以使用相同的c#syntaxt创build脚本。 当你运行脚本时,没有创build程序集,解释在飞行中完成,所以性能很高。 所有的关键字都可以像C#一样。 我希望你会喜欢它。

这真的很好c#repl和交互式解释器

我相信Mono在为特定平台实施JIT之前拥有薄荷 ,他们使用的翻译。 虽然在官方网站(例如运行时 )的文档说,它只是一个中间状态,然后巩固的虚拟机,我敢肯定,这是我最后一次在Linux上编译它。 不幸的是,我现在不能检查它,但也许它正在朝着你想要的方向发展。

Snippet编译器是你在找什么?