c#4中的DLR和Javascript解释?

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

但我得到的结果是:

在此处输入图像描述

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

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

这似乎是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。 如果您尝试解决此错误或报告并希望修复它,则由您决定。

如果您正在寻找在.NET中如何执行javascript以及如何在Windows程序(如Internet Explorer)中执行它的1:1匹配,有一种方法可以重用Windows脚本引擎(不仅仅是Jscript而是在SO上描述的VBScript或任何其他ActiveX Scripting语言: 通过C#解析并执行JS

这是使用此技术实现代码的方式:

  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())