c#4中的DLR和Javascript解释?

时间:2012-12-03 12:32:43

标签: c# .net dynamic .net-4.0 dynamic-language-runtime

我想使用DLR从c#执行javascript代码。

所以我使用c# Jint 编写了一个简单的代码:

  var script = @"
                               function show( )
                               {
                                      return  parseInt('123asd'); //in js it's 123
                               };
                               return show();";

                var result = new JintEngine().Run(script);
                Console.WriteLine(result);
javascript中的

parseInt('123asd')是:123

但我得到的结果是:

enter image description here

  • 也许我看不到全貌,但如果世界另一端的程序员发给我他的脚本文件,我(和他)期望结果一致!

  • 如果我弄错了,在什么情况下我会在.Net上运行其他代码? (对于每行代码,我必须非常非常可疑 ...)

2 个答案:

答案 0 :(得分:4)

这似乎是Jint partseInt函数的当前行为。

相关代码:

// most common case
double result;
if(double.TryParse(number,NumberStyles.Any, CultureInfo.InvariantCulture, out result)) {
    // parseInt(12.42) == 42
    return NumberClass.New(sign * Math.Floor(result));
}
else {
    return this["NaN"];
}

.NET double.TryParse不会将'123asd'解析为123,但会返回无法解析整个字符串的内容。

您应该在Jint中填写错误报告。

E:这是"标准"的问题。您永远无法在所有实施中获得100%兼容的标准。总会有差异。看看IE vs Chrome vs Firefox vs Opera。所有这些使用不同的JavaScript引擎,所以你可以期待差异。如果你真的想要交叉兼容,你应该按照标准实现,并将所有非标准行为视为实现中的bug。如果您尝试解决此错误或报告错误并希望修复它,则由您决定。

答案 1 :(得分:3)

如果您正在寻找在.NET中如何执行javascript以及如何在Windows程序(如Internet Explorer)中执行它之间的1:1匹配,有一种方法可以重用Windows脚本引擎(不是只有Jscript而且还有VBScript或任何其他ActiveX Scripting语言),这些在SO上描述:parse and execute JS by C#

这就是使用这种技术实现代码的方法:

        var script = @"
                           function show( )
                           {
                                  return  parseInt('123asd'); //in js it's 123
                           }"; // Note I have removed the return as it's not needed here

        using (ScriptEngine engine = new ScriptEngine("jscript"))
        {
            ParsedScript parsed = engine.Parse(script);
            Console.WriteLine(parsed.CallMethod("show"));
        }
    }

这将按预期输出123。注意我认为使用新的dynamic C#关键字可以改进原始代码,因此我们可以直接编写Console.WriteLine(parsed.show())