我想使用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上运行其他代码? (对于每行代码,我必须非常非常可疑 ...)
答案 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())
。