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