那里有一个现成的C#解释器,那不依赖于运行时编译吗?
我的要求是:
脚本引擎
必须处理C#语法
必须在中等信任环境中工作
不得使用运行时编译(CodeDomProvider ...)
开源(或至少免费用于个人和专业用途)
如果不清楚,我需要像Jint(http://jint.codeplex.com/)这样的东西,但它允许我编写C#脚本而不是JavaScript脚本.
谢谢你的帮助.
你看过paxScript.NET了吗?
查看Mono项目.他们最近演示了CsharpRepl,听起来就像你追求的那样.PDC 2008视频在这里.
在另一种可能是包括单C#编译器(来源这里在您的项目),并用它来生成您从文件系统加载程序集.您担心加载所有这些程序集所需的资源可能需要在单独的AppDomain中加载它们.
我需要评估10000多个不同的小脚本,编译所有这些脚本会非常慢
解释这些将更加缓慢.我们有一个类似的问题,我们解决如下:
我们使用Gold Parser项目来解析源代码并将其转换为基于XML的"通用语言".我们通过生成VB.Net源代码的转换来运行它(仅仅因为它不区分大小写).然后,我们使用.Net运行时将它们编译为独立的DLL,并使用严格限制的访问来调用它.
听起来好像你正在创建类似动态网站的东西,人们可以在其中创建自定义模块或功能片段,但使用C#来实现这一点会带来几个主要问题; 必须编译C#,唯一的办法是在运行时插入它,这是不可行的,即使你编译每个片段,你最终会得到10,000个DLL,这是不切实际和不可用的.
如果您的片段很少更改,那么我会考虑以编程方式将它们包装到一组源中,每个源都有一个唯一的名称,然后一次编译它们(或者每隔10分钟作为一个定时进程?).这就是我们所做的,因为它还允许人们会话的"版本控制",因此他们继续使用他们在会话开始时使用的DLL版本,但是当每个会话停止使用旧版本时,它就会被删除.
如果您的片段在一天中定期更改,那么我建议您查看一种解释过的脚本语言,甚至是PHP,并根据您需要的功能混合您的语言.CScript和LinqPad等产品都使用CodeDomProvider,因为如果要编译编译逻辑,必须在某处安装IMSL.
唯一的另一种选择是编写自己的解释器并使用反射来访问您需要访问的所有其他库,但这非常复杂和可怕.
由于您的要求实际上无法实现,我建议您退后一步,找出消除一项或多项限制的方法.无论您是否找到FullTrust环境来编译您的代码段,都不需要完整的代码支持(即转移到解释的代码段支持),甚至将整个框架更改为非.Net的内容.