В Chakra Core как вы возвращаете значения без проблем с памятью?

Я следовал этому примеру здесь, пытаясь создать простой движок javascript, который может выполнять javascript, например, библиотеку zxcvbn. Я думал, что понял это, но есть некоторые части образца, которые я не понимаю. В частности, как получить значения из функции 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 вызывается обратно.

Спасибо за вопрос, и да, конечно.

На высоком уровне большинство проблем с 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, который обрабатывает потоки. Я также добавил похожий код для добавления и удаления ссылок на параметры. Я вернусь сюда, чтобы подтвердить, решит ли это проблему в долгосрочной перспективе.

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

Другие вопросы по тегам