用C#在Win 8.1 Chakra中执行JS的一个失败的最小例子

A failing minimal example of executing JS in Win 8.1 Chakra with C#

本文关键字:一个 失败 Win Chakra JS 执行      更新时间:2024-02-22

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

有人能说出我错过了什么/做了什么/弄糊涂了吗?

我怀疑你还在为此而挣扎。。。但我只是找到了答案。

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

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

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

现在我的代码运行良好。我已经向GitHub上的样本所有者发送了一个拉取请求,以解决这个问题。更新当前在我的分叉中https://github.com/billti/chakra-host

尝试将其添加到AssemblyInfo.cs文件中:

[module: DefaultCharSet(CharSet.Unicode)]

我修改了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);

这至少可以为您提供更多信息。