1

我正在尝试通过以下代码执行一小段 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”错误,没有我能够发现的其他详细信息。

有没有人能够透露我错过了什么/做的愚蠢/感到困惑?

4

3 回答 3

3

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

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

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

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

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

于 2014-10-17T06:57:36.650 回答
1

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

[module: DefaultCharSet(CharSet.Unicode)]
于 2015-01-22T11:10:16.237 回答
0

我修改了我的实现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-01-15T22:59:47.770 回答