【问题标题】:A failing minimal example of executing JS in Win 8.1 Chakra with C#使用 C# 在 Win 8.1 Chakra 中执行 JS 的失败最小示例
【发布时间】:2013-12-04 11:43:27
【问题描述】:

我正在尝试通过以下代码执行一小段 JS(利用来自 MSDN 的 Chakra Host 示例中的 Native 类):

        var runtime = default(JavaScriptRuntime);
        Native.ThrowIfError(Native.JsCreateRuntime(JavaScriptRuntimeAttributes.None, JavaScriptRuntimeVersion.VersionEdge, null, out runtime));

        var context = default(JavaScriptContext);
        Native.ThrowIfError(Native.JsCreateContext(runtime, (Native.IDebugApplication64)null, out context));
        Native.ThrowIfError(Native.JsSetCurrentContext(context));

        var script = @"var bob = 1;";
        var result = default(JavaScriptValue);
        var contextCookie = default(JavaScriptSourceContext);

        Native.ThrowIfError(Native.JsRunScript(script, contextCookie, "source", out result));

问题是它返回一个“ScriptCompile”错误,没有我能够发现的其他详细信息。

有没有人能透露我错过了什么/做了什么/弄糊涂了?

【问题讨论】:

  • 我尝试通过替换 C# 示例的 main 方法来编译它,它在我的机器上运行良好。我会尝试下面 Justin 的代码,看看您是否可以获得有关错误的更多详细信息,以找出问题所在。
  • 您是否尝试将其作为 STA 线程运行?我不确定这是否有必要。

标签: c# javascript chakra


【解决方案1】:

我怀疑你还在为此苦苦挣扎……但我刚刚做了并想出了答案。

如果您查看 jsrt.h,您会发现所有本机函数在使用字符串参数时都使用 wchar_t,但是 DllImport 属性未指定字符集,因此它默认为 ANSI。

我在 Native.cs 文件中进行了查找/替换,并将所有 DllImport 属性更改为读取...

[DllImport("jscript9.dll", CharSet = CharSet.Unicode)]

...现在我的代码可以正常工作了。我已经向 GitHub 上的示例所有者发送了一个拉取请求,以解决这个问题。更新目前在我的 fork 中 https://github.com/billti/chakra-host

【讨论】:

    【解决方案2】:

    尝试将此添加到您的 AssemblyInfo.cs 文件中:

    [module: DefaultCharSet(CharSet.Unicode)]
    

    【讨论】:

      【解决方案3】:

      我修改了Native.ThrowIfError 的实现,以在出现ScriptCompile 错误的情况下从errorObject 中获取一些值。像这样:

      var message = errorObject
          .GetProperty("message")
          .ToString();
      var source = errorObject
          .GetProperty("source")
          .ToString();
      var line = (int)errorObject
          .GetProperty("line")
          .ToDouble();
      var column = (int)errorObject
          .GetProperty("column")
          .ToDouble();
      var length = (int)errorObject
          .GetProperty("length")
          .ToDouble();
      
      throw new JavaScriptParseException(error, message, source, line, column, length);
      

      这至少应该为您提供更多信息。

      【讨论】:

        猜你喜欢
        • 2014-08-11
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多