Предоставление определенных пространств имен Jint
Я хотел бы разрешить сценариям, работающим в Jint, доступ к уже существующему API, который я настроил в качестве пространства имен. Под этим я подразумеваю, что у меня есть одно пространство имен, которое содержит API, включая другие пространства имен. Я не хочу разрешать сценариям доступ к остальной части кода, включая.Net Framework.
Я уже разместил это на форуме Jint здесь: http://jint.codeplex.com/discussions/310772 Однако, неуважение к ним, но форум, кажется, не очень активен, и я хотел бы быть в состоянии ответить на это Как можно скорее, поэтому я публикую здесь.
Некоторое время назад ThomasMaierhofer достиг чего-то похожего на это, что я, вероятно, мог бы изменить, чтобы решить это здесь: http://jint.codeplex.com/discussions/211291
На мой неопытный мозг это похоже на действительно аккуратный способ выставить API движку, но я никогда раньше не видел, чтобы это делалось так.
Итак, мои вопросы: будет ли это работать? И если так, то почему это не было сделано раньше? И есть ли способ, которым я мог бы достичь этого без изменения источника Jint, чтобы я мог легко обновлять Jint.dll по мере появления новых версий?
РЕДАКТИРОВАТЬ: текущий API у меня состоит из нескольких классов, каждый из которых имеет несколько функций. Я могу выставить конкретные экземпляры этих классов абсолютно нормально, используя SetParameter. Jint также имеет свойство AllowClr, которое позволяет сценарию получать доступ к CLR с помощью полностью определенных пространств имен. Это пример кода, который они дают, демонстрируя, что произойдет, если вы установите значение false. Источник: http://jint.codeplex.com/wikipage?title=Using%20.NET%20classes%20from%20scripts
string stringBuilder = @"
var sb = new System.Text.StringBuilder();
return sb.ToString();
";
var engine = new JintEngine();
engine.AllowClr = false;
engine.Run(stringBuilder); // throws a SecurityException
Я хотел бы разрешить это, но только для определенного пространства имен, а не для всего остального. Я надеюсь, что это проясняет вопрос.
Спасибо за вашу помощь,
Сэм.
PS Я работаю в VB.Net, но ответы с участием C# в порядке.
1 ответ
У Jint есть два основных способа достижения желаемого: SetParameter
, в котором вы можете передать экземпляр объекта, который будет вызываться из интерпретатора, обратившись к нему с выбранным вами именем, и SetFunction()
, чтобы позволить движку напрямую вызывать функцию в коде хостинга. Вы можете работать с отражением, если вы хотите программным образом раскрыть множество объектов по некоторому соглашению, и я думаю, что это будет соответствовать вашим требованиям без изменения кода jint.