javascript - 在 Chakra Core 中,如何在不引起内存问题的情况下返回值?

标签 javascript c# chakracore

我一直在关注这个例子,试图创建一个简单的 javascript 引擎,它可以像 zxcvbn 库一样执行 javascript。我以为我已经弄明白了,但样本的某些部分我不明白。具体来说,如何在不引起任何内存问题的情况下从 javascript 函数中获取值。

https://github.com/Microsoft/Chakra-Samples/tree/master/ChakraCore%20Samples/JSRT%20Hosting%20Samples/C%23

这是我创建的示例。 https://github.com/janmchan/ChakraCoreHostC-

它运行良好,但是当我在实际项目中使用它时,我经常遇到类似于下面描述的问题(访问冲突异常)的崩溃。

https://github.com/Microsoft/Chakra-Samples/issues/4

这是该问题的解决方案。但是,我不太了解样本的那部分。如果您运行示例,它只会返回脚本返回值的两倍。我什至不明白 runScriptDelegate 是如何被回调的。

Thanks for asking, and yes of course.

On a high level, most of the AV issues here come from that in the C# app, installed callbacks are not retained and got garbage collected before being invoked. For example, you create a function like this,

//JsNativeFunction callback
private static JavaScriptValue nativeFunction(JavaScriptValue callee, bool isConstructCall, JavaScriptValue[] arguments, ushort argumentCount, IntPtr callbackData) 
{
    //do something here
}

...

JsCreateFunction(nativeFunction, callbackData, func);

最佳答案

我想我已经通过查看 JavaScriptEngineSwitcher 解决了这个问题。据我了解,他们有一个 ScriptDispatcher 来处理线程。我还添加了一些类似的代码来添加和删除对参数的引用。我会回到这里确认这是否能长期解决问题。

https://raw.githubusercontent.com/Taritsyn/JavaScriptEngineSwitcher/2.X/src/JavaScriptEngineSwitcher.ChakraCore/ChakraCoreJsEngine.cs

2018-03-06 更新:这确实解决了我们的问题。这是我需要进行的更改示例。

存储库:https://github.com/janmchan/ChakraCoreHostC-

提交:https://github.com/janmchan/ChakraCoreHostC-/commit/da5810f8f559ebe8ce2c2e50cd8808dc91caa087

关于javascript - 在 Chakra Core 中,如何在不引起内存问题的情况下返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48338968/

相关文章:

javascript - svg viewbox 不应该调整文本 fontSize 的大小?

c# - 如何覆盖 C# Winforms 中的 Control.Enabled 属性?

c# - 在 Linq to Entities 查询中编写 if then else

node.js - 如果没有一些内部模块,如何构建node.js?

windows - 如何在 Golang 中将 void 指针传递给 Windows DLL (void**)

javascript - 在 Javascript 中等待来自 JQuery $.each 中的异步嵌套函数的数据

javascript - 从组件外部更改状态

C# 字符串和 VARCHAR 和 NVARCHAR

javascript - jScrollPane 不适用于 meteor.js