Внедрение JavaScript-движка в .NET.

просто интересно, кто-нибудь когда-либо пытался внедрить и фактически интегрировать любой js-движок в среду .net. Я мог найти и фактически использовать (после LOT боли и усилий, так как это довольно устаревшее и не совсем законченное) проект spidermonkey-dotnet. Любой, кто имеет опыт работы в этой области? Двигатели типа SquirrelFish, V8..

Не то, чтобы я не был доволен Mozilla Spidermonkey (используя его для мини-диаграммы Rails-типа для пользовательских компонентов внутри основного приложения ASP.NET), но мне все равно хотелось бы немного поработать с этими опциями. Решения командной строки не то, что мне нужно, я не могу полагаться ни на что иное, кроме CLR, мне нужно вызвать методы из/в объекты JavaScript/С#.

// c# class
public class A
{
    public string Hello(string msg)
    {
        return msg + " whatewer";
    }
}

// js snippet
var a = new A();
console.log(a.Hello('Call me')); // i have a console.log implemented, don't worry, it not a client-side code :)

Просто для пояснения - я не пытаюсь фактически программировать само приложение на серверном javascript. Он используется исключительно для написания пользовательских субаппликаций (можно рассматривать как своего рода DSL). Это намного проще (и безопаснее), чтобы нормальные люди программировали в js, чем С#.

Ответ 1

Попробуйте Javascript.NET. Он размещен на GitHub. Первоначально он был размещен на CodePlex, здесь)

Обсуждение проектов: http://javascriptdotnet.codeplex.com/discussions

Он реализует Google V8. Вы можете скомпилировать и запустить JavaScript непосредственно из .NET-кода с ним и предоставить объекты CLI, которые также будут использоваться кодом JavaScript. Он генерирует собственный код из JavaScript.

Ответ 2

Исходный JavaScript-интерпретатор Jint (http://jint.codeplex.com) делает именно то, что вы ищете.

Изменить:
Проект полностью переписан и теперь размещен на Github по адресу https://github.com/sebastienros/jint

Ответ 3

Вас также может заинтересовать Microsoft ClearScript который размещен на GitHub и опубликован в соответствии с лицензией Ms-Pl.

Я не поклонник Microsoft, но я должен признать, что поддержка V8 имеет те же функции, что и Javascript.Net, и что более важно, проект по-прежнему поддерживается. Насколько мне известно, поддержка делегатов также работает лучше, чем с Spidermonkey-dotnet.

ps: Он также поддерживает JScript и VBScript, но мы не интересовались этим старым материалом.

ps: он совместим с .NET 4.0 и 4.5 +

Ответ 5

Вы можете попробовать ironJS, выглядит многообещающим, хотя он находится в тяжелом развитии. https://github.com/fholm/IronJS

Ответ 6

Я догадываюсь, что до сих пор не понял, что именно вы пытаетесь сделать, но JScript.NET может стоить взглянуть, хотя Managed JScript кажется, что он может быть более подходящим для ваших нужд (это скорее JavaScript, чем JScript.NET).

Лично я думал, что было бы здорово интегрировать V8 каким-то образом, но я не стал загружать исходный код; что у меня было время, чтобы на самом деле что-то с этим сделать.

Ответ 7

Если язык не является проблемой (любая песочница, написанная сценарием), то LUA для .NET. Версия Silverlight платформы .NET также изолирована от afaik.

Ответ 9

Вместо этого я придумал гораздо более простое решение.

Я построил файл .dll с помощью Javascript, а затем скомпилировал его с помощью компилятора Javascript, который доступен в командной строке разработчика VS2013.

Как только у нас есть .dll, мы просто добавляем его в папку \Support, а затем ссылаемся на него в проекте, который должен анализировать утверждения Javascript.

Подробные шаги для создания .dll:

  • Создайте файл в Блокноте только с этим содержимым:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
    
  • Сохраните файл как C:\MyEval.js

  • Откройте командную строку VS2005 (Пуск, Программы, VS2005, Инструменты VS2005)

  • Введите Cd\, чтобы перейти в C:\

  • Введите

    jsc /t:library C:\MyEval.js
    
  • Создается новый файл с именем MyEval.dll.

  • Скопируйте MyEval.dll в проект и укажите его (также ссылку Microsoft.Jscript.dll).

  • Затем вы сможете называть его следующим образом:

    Dim jScriptEvaluator As New EvalClass
    Dim objResult As Object
    objResult = jScriptEvaluator.Evaluate("1==1 && 2==2")
    

objResult - True.

Ответ 10

Script # компилирует С# в js и является дочерним мозгом одной из команд ASP.Net. Rick Strahl также имеет некоторые сообщения о встраивании js в качестве механизма выполнения для оценки выражения.

Ответ 11

Эй, посмотрите Javascript.NET на codeplex (http://javascriptdotnet.codeplex.com/) с версией 0.3.1 есть несколько довольно сладких новых функции, которые будут вам интересны.

Посмотрите пример кода:

// Initialize the context
JavascriptContext context = new JavascriptContext();

// Setting the externals parameters of the context
context.SetParameter("console", new SystemConsole());
context.SetParameter("message", "Hello World !");
context.SetParameter("number", 1);

// Running the script
context.Run("var i; for (i = 0; i < 5; i++) console.Print(message + ' (' + i + ')'); number += i;");

// Getting a parameter
Console.WriteLine("number: " + context.GetParameter("number"));

Ответ 12

Я просто попробовал RemObjects Script для. Net.

Он работает, хотя мне пришлось использовать статический factory (var a=A.createA();) из JavaScript вместо синтаксиса var a=new A(). (Функция ExposeType предоставляет только статику!) Не так много документации и источника написано с помощью Delphi Prism, что довольно необычно для меня и рефлектора RedGate.

Итак: Простота в использовании и настройке, но не большая помощь для расширенных сценариев.

Также необходимо установить что-то вместо того, чтобы просто отбрасывать сборки в каталоге, является отрицательным для меня...

Ответ 13

Microsoft документировал способ добавления расширения script к чему-либо - IActiveScript. Вы можете использовать IActiveScript из любого приложения .NET для вызова логики script. Логика может размещаться на объектах .NET, которые вы разместили в контексте сценариев.

Этот ответ предоставляет приложение, которое делает это, с кодом:

Ответ 14

Существует реализация ActiveX Scripting Engine Host в С#, доступный здесь: разбор и выполнить JS на С#

Он позволяет использовать Javascript (или VBScript) непосредственно из С# в собственных 32-битных или 64-битных процессах. Полный источник ~ 500 строк кода С#. Он имеет только неявную зависимость от установленной DLL-библиотеки JScript (или VBScript).

Например, следующий код:

Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3"));

отобразит 1.66666666666667

Ответ 15

Существует также MsieJavaScriptEngine, в котором используется движок Chakra Engineers Engineers

Ответ 16

Я знаю, что открываю старый поток, но я много работал над smnet (spidermonkey-dotnet). В последние годы. Основным направлением развития стало беспрепятственное внедрение объектов .net в двигатель spidermonkey. Он поддерживает широкий диапазон преобразований из значений js в .net-объекты. Некоторые из них включают делегатов и события.

Просто скажу, что сейчас стоит проверить, что там есть устойчивое развитие:). Я постоянно обновляю репозиторий SVN с исправлениями ошибок и новыми функциями. Файлы исходного и проектного решений настроены на успешную сборку при загрузке. Если есть какие-либо проблемы с этим, не стесняйтесь открывать дискуссию.

Я действительно понимаю желание иметь управляемое решение javascript, но из всех управляемых javascript, которые я использовал, им очень не хватает некоторых ключевых функций, которые помогают сделать их надежными и удобными в работе. Я сам жду от IronJS, чтобы немного поразмыслить. Пока я жду, мне весело играть с spidermonkey-dotnet =)

проект и страница загрузки spidermonkey-dotnet

Изменить: созданная страница документации wiki сегодня днем.

Ответ 17

Попробуйте ReoScript, интерпретатор JavaScript с открытым исходным кодом, реализованный на С#.

ReoScript позволяет вашему приложению выполнять JavaScript. Он имеет множество меток расширения, таких как SetVariable, расширение функции, использование CLR-типа, привязка события .NET и т.д.

Hello World:

ScriptRunningMachine srm = new ScriptRunningMachine();
srm.Run(" alert('hello world!'); ");

И вот пример script, который создает winform и показывает его.

import System.Windows.Forms.*;        // import namespace

var f = new Form();                   // create form
f.click = function() { f.close(); };  // close when user clicked on form

f.show();                             // show 

Ответ 18

Я считаю, что все основные механизмы JS с открытым исходным кодом (JavaScriptCore, SpiderMonkey, V8 и KJS) обеспечивают внедрение API. Единственный, с которым я действительно знаком, это JavaScriptCore (который является именем JS-движка, в котором живет SquirrelFish), который обеспечивает чистый C API. Если память служит (прошло некоторое время с тех пор, как я использовал .NET)..NET имеет довольно хорошую поддержку для компоновки в C API.

Я честно не уверен, что такое API для других движков, но я знаю, что все они им предоставляют.

Тем не менее, в зависимости от ваших целей JScript.NET может быть лучшим, так как все эти другие механизмы потребуют от вас включения их в ваше приложение, поскольку АО является единственным, на самом деле поставляемым с ОС, но эта ОС MacOS: D

Ответ 19

Используйте JSCRIPT.NET для получения библиотеки (dll) js. Затем укажите эту DLL в своем приложении .NET, и вы просто там. СДЕЛАНО!

Ответ 20

V8.NET - новый парень на блоке (по состоянию на апрель 2013 года), который более тесно обертывает собственную функциональность V8. Это позволяет больше контролировать реализацию.

Ответ 22

Теперь возможно с ASP.Net MVC4 Razor Просмотр движка. код будет следующим:

// c# class
public class A
{
    public string Hello(string msg)
    {
        return msg + " whatewer";
    }
}

// js snippet
<script type="text/javascript">
var a = new A();
console.log('@a.Hello('Call me')'); // i have a console.log implemented, don't worry, it not a client-side code :)
</script>

и Razor предназначены не только для MVC4 или других веб-приложений, и вы можете использовать его в автономных настольных приложениях.