Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#解释器(无编译)_C#_Scripting - Fatal编程技术网

C#解释器(无编译)

C#解释器(无编译),c#,scripting,C#,Scripting,有没有现成的C#解释器,即不依赖运行时编译的解释器 我的要求是: 脚本引擎 必须处理C#语法 必须在中等信任环境下工作 不得使用运行时编译(CodeDomProvider…) 开源(或至少免费供个人和专业人士使用) 如果这还不清楚,我需要类似Jint()的东西,但它允许我编写C#scripts而不是JavaScript脚本 谢谢你的帮助。你看过吗?或 奥列格在上写了一篇很好的介绍,看看这个项目。他们最近演示了听起来像你在追求的东西。PDC2008视频 更新: 仔细看,似乎不可能使用服务来评

有没有现成的C#解释器,即不依赖运行时编译的解释器

我的要求是:

  • 脚本引擎
  • 必须处理C#语法
  • 必须在中等信任环境下工作
  • 不得使用运行时编译(CodeDomProvider…)
  • 开源(或至少免费供个人和专业人士使用)
如果这还不清楚,我需要类似Jint()的东西,但它允许我编写C#scripts而不是JavaScript脚本

谢谢你的帮助。

你看过吗?

或 奥列格在

上写了一篇很好的介绍,看看这个项目。他们最近演示了听起来像你在追求的东西。PDC2008视频


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

另一种可能性是在项目中包含(源),并使用它生成从文件系统加载的程序集。如果您担心加载所有这些程序集所需的资源,您可能必须将它们加载到单独的AppDomain中。

它不能处理精确的C#语法,但是PowerShell与.NET framework的关系非常密切,而且是一个非常成熟的产品,我认为您不明智地忽略它,至少是一个可能的解决方案。微软推出的大多数服务器产品现在都支持PowerShell的脚本接口,包括Microsoft Exchange和Microsoft SQL server。

我相信Mono有mint,他们在为给定平台实施JIT之前使用的解释器。虽然官方网站上的文档(例如)说它只是整合jitting虚拟机之前的一个中间状态,但我很确定上次在Linux上编译它时它就在那里。不幸的是,我现在不能很好地检查它,但它可能正朝着您想要的方向。

是您想要的吗?

可以作为代码段IDE使用。该应用程序非常小且轻量级。它是免费的(比如啤酒),但不是开源的。自动完成需要额外的费用,但不多(19美元)


编辑:在仔细阅读了这篇文章中的评论之后,我认为LINQPad不是你想要的。您需要能够以编程方式动态评估数千个小脚本的东西,对吗?我在工作中用铁红宝石很容易做到这一点。如果您愿意使用DLR语言,这可能更可行。我还用一些代码做了一些类似的工作,这些代码可以计算作为字符串传入的C#lambda表达式,但这是非常有限的。在一个项目中,我希望提供一种通用的方法来指定控制何时必须生成某个字母的条件。在另一个项目中,条件控制着如何将案例分配给队列。在这两种情况下,以下解决方案都非常有效:

  • 代码段的语言——我选择了JScript,这样就不必担心变量类型
  • 编译-是的,它需要完全信任,但是您可以将代码放在单独的程序集中并给予它完全信任。不要忘记用AllowPartiallyTrustedCaller属性标记它
  • 代码段的数量-我将每个代码段视为一个方法,而不是一个类。这样,可以将多个方法组合到单个程序集中
  • 磁盘使用-我在内存中完成了所有编译,但没有将程序集保存到磁盘。如果需要重新加载,它也会有所帮助
  • 所有这些都可以在生产中正常工作,没有任何问题

    编辑

    只是为了澄清“snippet”——我所说的条件只是布尔表达式。我通过编程添加了额外的文本,将其转换为方法,并将方法转换为可编译类

    我也可以用C做同样的事情,尽管我仍然认为JScript更适合用于代码片段

    顺便说一句,我的代码是开源的,欢迎使用。请记住,这里有很多代码与本次讨论无关。如果您需要帮助查找与此主题相关的文章,请告诉我

    我需要评估10000多个小项目 所有不同的脚本, 汇编所有这些文件将是公正的 慢得惊人

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

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

    听起来好像你正在创建一个动态网站,人们可以在其中创建自定义模块或功能片段,但使用C#来实现这一点会带来几个主要问题;C#必须编译,唯一的解决方法是在运行时对其进行interpet,这是不可行的,即使编译每个代码段,最终也会得到10000个DLL,这是不切实际和不可用的

    如果你的代码片段很少改变,那么我会考虑程序化地将它们封装成一组源,每个源都有唯一的名称,然后在一个镜头中编译它们(或者每隔10分钟作为一个定时进程)。这就是我们要做的,因为它还允许对人员会话进行“版本控制”,以便他们继续使用会话开始时使用的DLL版本,但当每个会话停止使用旧版本时,就会将其删除

    如果您的代码片段在一天中有规律地变化,那么我建议您改为使用解释脚本语言,甚至是PHP,并根据您需要的功能混合使用您的语言。CScript和LinqPad等产品都使用CodeDomProvider,因为您必须
    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);