В Chakra Core как вы возвращаете значения без проблем с памятью?
Я следовал этому примеру здесь, пытаясь создать простой движок javascript, который может выполнять javascript, например, библиотеку zxcvbn. Я думал, что понял это, но есть некоторые части образца, которые я не понимаю. В частности, как получить значения из функции JavaScript, не вызывая проблем с памятью.
Вот пример, который я создал. https://github.com/janmchan/ChakraCoreHostC-
Он работает нормально, но когда я использую его в реальном проекте, я часто получаю сбои, похожие на проблему, описанную ниже (исключение нарушения прав доступа).
https://github.com/Microsoft/Chakra-Samples/issues/4
Вот решение этой проблемы. Однако я не совсем понимаю эту часть образца. Если вы запустите пример, он просто вернёт вдвое больше, чем когда-либо возвращал скрипт. Я даже не понимаю, как runScriptDelegate вызывается обратно.
Спасибо за вопрос, и да, конечно.
На высоком уровне большинство проблем с AV происходит из-за того, что в приложении C# установленные обратные вызовы не сохраняются и перед сборкой мусора собирается. Например, вы создаете такую функцию,
//JsNativeFunction callback
private static JavaScriptValue nativeFunction(JavaScriptValue callee, bool isConstructCall, JavaScriptValue[] arguments, ushort argumentCount, IntPtr callbackData)
{
//do something here
}
...
JsCreateFunction(nativeFunction, callbackData, func);
1 ответ
Я думаю, что я решил проблему, посмотрев на JavaScriptEngineSwitcher. Насколько я понимаю, у них есть ScriptDispatcher, который обрабатывает потоки. Я также добавил похожий код для добавления и удаления ссылок на параметры. Я вернусь сюда, чтобы подтвердить, решит ли это проблему в долгосрочной перспективе.
Обновление 2018-03-06: это действительно решило нашу проблему. Вот образец изменений, которые мне нужно было сделать.
Репозиторий: https://github.com/janmchan/ChakraCoreHostC-
Фиксация: https://github.com/janmchan/ChakraCoreHostC-/commit/da5810f8f559ebe8ce2c2e50cd8808dc91caa087