【问题标题】:DLR and Javascript interpretation in c# 4?c# 4 中的 DLR 和 Javascript 解释?
【发布时间】:2012-11-20 22:10:57
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

这似乎是 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。如果您尝试解决此错误或报告它并期望它得到修复,这取决于您。

【讨论】:

  • 我敢肯定,如果我使用另一个 Javascript 解释器,我会发现其他不匹配的地方。我重复我的问题:也许我看不到全貌,但如果另一个程序员世界的一边给我发他的脚本文件,我(和他)希望结果是一致的!
  • 我的问题比这个糟糕的 JINT 更抽象。我如何才能相信不同的代码(由 DLR 支持)行为与我的 C# 中的行为完全相同? (例如:somone 可以在 JS 中编写一个 complext 算法。并且(您必须同意)它必须产生 100% 相同的结果 - 就像我自己在 c# 中编写的一样。
  • @RoyiNamir 你为什么会这样? C# 和 JS 是完全不同的语言,具有不同的编程方式。除非您对这两种方式都进行了测试,否则您无法获得准确的结果。
  • (当然它们是不同的。但我的 POV 是 DLR。)所以你要说的是:虽然它们都是基于 DLR 构建的,但我不能指望相同的代码产生相同的结果。那么:“基于 DLR 构建的不同语言”有什么好处?
  • @RoyiNamir 哦。正确的。您对 DLR 的含义感到困惑。第一的。 C# 在 CLR 上运行,而不是在 DLR 上运行。其次,DLR 只是“方便”功能。它与运行实际代码无关。它只允许在 .NET 中更简单地实现动态语言。此外,Jint 似乎与 DLR 无关。它只是在 .NET 中构建的 javascript 解释器
【解决方案2】:

如果您正在寻找 .NET 中的 javascript 执行方式与 Internet Explorer 等 Windows 程序执行方式之间的 1:1 匹配,那么有一种方法可以重用 Windows 脚本引擎(不是仅 Jscript 以及 VBScript 或任何其他 ActiveX Scripting 语言)在此处描述: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())

【讨论】:

  • Simon,JS 是否发生了变化,现在通过 c#,我可以做到 parsed.show() 了吗?我的意思是,他们做了什么来使这个电话起作用?他们不得不改变一些东西......
  • 是的,dynamic 关键字意味着您可以在其上调用任何方法/属性,它将在运行时解析,而不是在编译时解析(因此您基本上可以键入任何内容并编译)。创建 dynamic 的原因之一就是 COM 互操作(这就是我的示例的工作方式)。
  • 我知道动态在 C# 中的含义。但他们必须以这样的方式公开 JS 即时通讯,以便我能够通过动态调用 func....
猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2015-12-30
  • 2011-01-08
相关资源
最近更新 更多