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

просто интересно, пробовал ли кто-нибудь встраивать и фактически интегрировать какой-либо движок js в среду .net. Я мог бы найти и фактически использовать (после МНОГО боли и усилий, поскольку он довольно устарел и не совсем закончен) проект spidermonkey-dotnet. Есть у кого опыт в этой области? Двигатели типа SquirrelFish, V8..

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

// 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's not a client-side code :)

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


person Community    schedule 05.10.2008    source источник


Ответы (21)


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

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

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

person Community    schedule 05.07.2010
comment
+1. Это просто и, кажется, отлично работает. - person J.C. Inacio; 07.06.2011
comment
Есть утверждения, что это мертво на форумах проекта, документация, кроме базового примера, плохая, и я изо всех сил пытаюсь добавить обработчик событий JavaScript к событию .Net с ним в сценарии. - person Alan Macdonald; 24.11.2011
comment
Noesis (первоначальная компания-разработчик) потеряла интерес к проекту, но в итоге решила передать управление сообществу. Следовательно, теперь есть новый выпуск, который включает в себя множество исправлений ошибок. К сожалению, обратные вызовы JavaScript из .Net пока не поддерживаются. - person Oliver Bock; 10.02.2012
comment
Еще одно замечание на будущее: похоже, что пакет Nuget каким-то образом не работает... в настоящее время он не работает только при установке пакета. - person Chris Pfohl; 14.02.2014
comment
Поскольку javascriptdotnet мертв, рассмотрите возможность использования вместо него ClearScript (см. этот ответ) - person JB. With Monica.; 26.05.2014
comment
Если вы устанавливаете через NuGet, установите платформу x86. AnyCPU не работает. - person Mrchief; 18.07.2014

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

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

person Sébastien Ros - MSFT    schedule 26.10.2009
comment
Еще одна возможность, созданная поверх DLR: сценарий RemObjects для .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/ p1175 - person aprilchild; 23.02.2010
comment
Я думаю, что он написан на Delphi Prism / Oxygen и предоставляется в виде исходного кода, поэтому, если вы не приобрели лицензию на вышеупомянутые продукты, это не так уж полезно. Я ошибся? Если где-нибудь есть версия в двоичной форме, я бы хотел попробовать. - person Andrew Savinykh; 01.04.2010
comment
Скрипт RemObjects написан на Oxygene, верно, но на самом деле вам не нужна лицензия Oxygene для его использования — например, вы можете получить бинарный установщик с remobjects.com/free, во-вторых, вы даже можете получить бесплатный компилятор командной строки Oxygene, если вам нужно будет собрать его самостоятельно из исходного кода. В конце концов, одним из больших преимуществ платформы .NET является независимость от языка. не имеет значения, на каком языке написана библиотека, чтобы вы могли ее использовать. - person marc hoffman; 10.12.2011
comment
Последний выпуск в 2011 году... Юрский период кажется лучше. - person Roman Starkov; 03.02.2014
comment
Последний релиз в 2014 году: github.com/sebastienros/jint - person Sébastien Ros - MSFT; 03.03.2014
comment
Работает ли переписанный Jint с Mono 2.0? К сожалению, Unity3D застрял в этой версии... - person kungfooman; 21.04.2015
comment
Это должно быть совместимо. Пока он поддерживает динамическое ключевое слово. - person Sébastien Ros - MSFT; 25.04.2015

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

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

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

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

person Community    schedule 14.06.2013
comment
+1 Я совершенно не знал об этом проекте, кажется многообещающим, будем надеяться, что он не умрет, как большинство других проектов, пытающихся сделать то же самое! - person Peter; 19.07.2013
comment
Одна вещь, которую я обнаружил в ClearScript с использованием движка Windows.JScript, отличается тем, что объекты .net теперь чувствительны к регистру, тогда как старый объект ScriptControl не имел значения. - person Brain2000; 06.04.2017
comment
Вот моя проблема с ClearScript. При запуске жалуется, что отсутствуют dll. Затем меня просят установить дополнительные компоненты визуальной студии. Это не проблема, за исключением того, что у меня не будет прав администратора, где я буду запускать код. Было бы неплохо, если бы он был полностью автономным в dll. - person TatiOverflow; 27.12.2017

Кто-нибудь, кто просто настраивается, посмотрите и Jurassic:

http://jurassic.codeplex.com/

edit: это переместилось на github (и на первый взгляд кажется активным)

https://github.com/paulbartrum/jurassic

person Community    schedule 09.01.2012
comment
Кажется, это один из немногих проектов, который имеет как собственный код .NET (вместо использования, например, движка V8), так и все еще поддерживаемый (Ecmascript.net, jscript.net и куча других, кажется, мертвых). +1 и спасибо за ссылку! - person atlaste; 26.01.2013
comment
После проверки всех проектов, перечисленных в этих ответах, я остановился на Jurassic. Это один из двух или трех, которые все еще активно поддерживаются, это настоящий JS, тщательно протестированный и чистый .NET. - person Roman Starkov; 03.02.2014
comment
Добавил бы свою поддержку Jurassic. Он также имеет возможность сериализовать состояние выполнения контекста выполнения. Это означает, что вы можете буквально сохранять свою среду выполнения JavaScript, переменные и все такое. Чрезвычайно полезная функция для некоторых случаев. - person Jerome Haltom; 14.01.2016
comment
Привет, васаби, мне не удалось найти ничего о том, как сериализовать состояние выполнения контекста выполнения. Как вы этого добились? - person Henning; 26.05.2016

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

person Community    schedule 23.01.2011
comment
В настоящее время мы используем IronJS, но в наши дни это мертвый проект, а компилятор написан на F #, с которым я могу работать, но не умею. - person russbishop; 26.04.2014

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

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

person Jason Bunting    schedule 05.10.2008
comment
на самом деле Managed JScript больше всего соответствует моим потребностям. Я знал, что это было в Silverlight, но не знал, что оно выпущено. JScript.NET не вариант. Я действительно не хочу предоставлять пользователям доступ ко всему стеку .NET. Мне просто нужна пара основных встроенных объектов, которые они могут использовать для своих приложений. - person aprilchild; 06.10.2008
comment
На дворе 2009 год, и Managed JScript уже мертв. - person Alexander Abramov; 25.11.2009

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

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

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

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

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

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

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

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

  5. Тип

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

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

  8. Тогда вы должны иметь возможность называть это так:

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

objResult — True.

person Community    schedule 21.07.2015

Если язык не является проблемой (любой изолированный сценарий), тогда есть LUA для .NET< /а>. Silverlight-версия .NET framework также является песочницей.

person Chris S    schedule 22.01.2009

Эй, взгляните на 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"));
person Community    schedule 24.08.2010
comment
Это работает для объектов .Net. например: если у меня есть класс Employee, могу ли я передать объект в V8 и управлять объектом Employee из JavaScript? - person Joy George Kunjikkuru; 22.11.2015

Вы можете использовать движок Chakra в C#. Вот статья на msdn, показывающая, как:

http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880< /а>

person Community    schedule 16.01.2014

Я только что попробовал скрипт RemObjects для .Net.

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

Итак: Простота в использовании и настройке, но не очень помогает в сложных сценариях.

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

person Community    schedule 05.07.2011

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

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

person Community    schedule 15.09.2011

Существует реализация узла ActiveX Scripting на C#, доступная здесь: анализ и выполнение JS с помощью C#

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

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

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

будет отображаться 1.66666666666667

person Community    schedule 02.12.2011

Существует также MsieJavaScriptEngine, использующий движок Internet Explorers Chakra.

person Community    schedule 12.02.2014

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

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

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

person olliej    schedule 06.10.2008
comment
да все основные движки вообще встраиваемые, но просто слишком много препятствий. изучение руководства по встраиванию, изучение C(++) API... я надеялся, что уже будет проделана некоторая работа по интеграции. JScript.NET нельзя использовать, фактический код написан и выполняется пользователями Интернета. - person aprilchild; 06.10.2008

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

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

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

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

Редактировать: сегодня днем ​​создал вики-страницу с документацией.

person Community    schedule 27.07.2011

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

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

Привет мир:

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

А вот пример скрипта, который создает 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 
person Community    schedule 12.02.2013

Используйте JSCRIPT.NET, чтобы получить библиотеку (dll) js . Затем укажите ссылку на эту dll в своем приложении .NET, и все готово. ВЫПОЛНЕНО!

person Community    schedule 06.03.2009

Вы можете использовать Rhino и движок Mozilla Javascript, написанный на Java, и использовать его с IKVM, вот несколько инструкций.

Инструкции: https://www.codeproject.com/Articles/41792/Embedding-JavaScript-into-C-with-Rhino-and-IKVM

person Community    schedule 10.05.2017

V8.NET — это новая разработка (по состоянию на апрель 2013 г.), Функционал двигателя V8. Это позволяет лучше контролировать реализацию.

person Community    schedule 29.05.2013

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

// 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's not a client-side code :)
</script>

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

person Community    schedule 23.08.2012