我试图通过以下代码执行一小段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”错误,没有我能够发现的其他细节。
是否有人能够透露我错过/做过的愚蠢/困惑?
答案 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);
这至少可以为您提供更多信息。