4

我想使用 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);

parseInt('123asd')在 javascript 中是:123

但我得到的结果是:

在此处输入图像描述

  • 也许我没有看到全貌,但是如果世界另一端的程序员向我发送他的脚本文件,我(和他)希望结果是一致的!

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

4

2 回答 2

4

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

相关代码:

// 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"];
}

.NETdouble.TryParse不会解析'123asd'123,但返回它无法解析整个字符串。

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

E:这是“标准”的问题。您永远无法在所有实现中获得 100% 兼容的标准。总会有分歧。看看 IE vs Chrome vs Firefox vs Opera。所有这些都使用不同的 javascript 引擎,因此您可以期待差异。如果你真的想要交叉兼容,你应该按照标准来实现,把所有非标准的行为都当作实现中的bug。如果您尝试解决此错误或报告它并期望它得到修复,这取决于您。

于 2012-12-29T20:16:44.417 回答
3

如果您正在寻找 javascript 在 .NET 中的执行方式与在 Internet Explorer 等 Windows 程序中的执行方式之间的 1:1 匹配,那么有一种方法可以重用 Windows 脚本引擎(不仅是 Jscript,而且也 VBScript 或任何其他ActiveX 脚本语言)在这里描述的 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预期输出。注意我认为可以使用新的 C# 关键字改进原始代码dynamic,因此我们可能可以Console.WriteLine(parsed.show())直接编写。

于 2012-12-30T10:09:07.170 回答