使用C#在Win 8.1 Chakra中执行JS的失败最小示例

时间:2013-12-04 11:43:28

标签: c# javascript chakra

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

是否有人能够透露我错过/做过的愚蠢/困惑?

3 个答案:

答案 0 :(得分:3)

我怀疑你还在努力解决这个问题......但我刚刚做了,并想出了答案。

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

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

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

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

答案 1 :(得分:1)

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

[module: DefaultCharSet(CharSet.Unicode)]

答案 2 :(得分: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);

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