Встраивание движка JavaScript в .NET [закрыто]


217

просто интересно, пытался ли кто-нибудь когда-либо встраивать и интегрировать какой-либо движок js в среду .net. Я мог бы найти и на самом деле использовать (после ЛОТ боли и усилий, так как это довольно устаревшей и не совсем законченный) SpiderMonkey-DotNet проект. Кто-нибудь с опытом в этой области? Двигатели типа SquirrelFish, V8 ..

Не то чтобы я не был удовлетворен Spidermonkey в Mozilla (использующим его для Railf-подобных мини-фреймворков для пользовательских компонентов внутри основного приложения 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 #.

Ответы:


98

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

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

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


+1. Это просто и, кажется, отлично работает.
JC Инасио

6
Есть утверждения, что это не работает на форумах проекта, документация за базовым примером плохая, и я изо всех сил пытаюсь добавить обработчик событий JavaScript в событие .Net, используя его в сценарии.
Алан Макдональд

6
Noesis (оригинальная компания-разработчик) потеряла интерес к проекту, но в итоге решила передать контроль сообществу. Следовательно, теперь есть новый выпуск, который включает в себя множество исправлений ошибок. К сожалению, обратные вызовы JavaScript из .Net пока не поддерживаются.
Оливер Бок,

Еще одно замечание на будущее: кажется, что пакет Nuget как-то не работает ... в настоящее время он не "просто работает" при установке пакета.
Крис Пфол

3
Поскольку javascriptdotnet мертв, рассмотрите возможность использования ClearScript вместо этого (см. Этот ответ )
JB. С моникой.

86

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

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


6
Еще одна возможность, созданная поверх DLR: скрипт RemObjects для .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
апрель

Я думаю, что он написан на Delphi Prism / Oxygen и предоставлен в виде исходного кода, поэтому, если вы не приобрели лицензию на вышеупомянутые продукты, это не так уж полезно. Я ошибся? Если где-нибудь есть версия в двоичном виде, я бы хотел попробовать.
Андрей Савиных

2
Сценарий RemObjects написан на Oxygene, правильно, но вам не нужна лицензия Oxygene для его использования - для одного вы можете получить бинарный установщик с remobjects.com/free , для другого вы даже можете получить бесплатный компилятор командной строки Oxygene, если Вам нужно было восстановить его самостоятельно, из источника. В конце концов, одним из больших преимуществ платформы .NEt является независимость от языка. для вас не имеет значения, на каком языке написана библиотека.
Марк Хоффман

1
Последний выпуск в 2011 году ... Юрский кажется лучше.
Роман Старков

3
Последний выпуск в 2014 году: github.com/sebastienros/jint
Себастьян Рос - MSFT

54

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

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

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

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


3
+1 Я совершенно не знал об этом проекте, кажется многообещающим, давайте надеяться, что он не умрет, как большинство других проектов, пытающихся сделать то же самое!
Питер

Одна вещь, которую я обнаружил в ClearScript при использовании механизма Windows.JScript, заключается в том, что объекты .net теперь чувствительны к регистру, тогда как более старый объект ScriptControl не имел значения.
Brain2000

Вот моя проблема с ClearScript. При запуске он жалуется, что отсутствуют DLL. Затем меня просят установить дополнительные визуальные компоненты студии. Это не проблема, за исключением того, что у меня не будет привилегий администратора, где я буду запускать код. Было бы хорошо, если бы это было полностью автономно в DLL.
TatiOverflow

38

Кто-нибудь, только настраивающийся, проверяет юрский также:

http://jurassic.codeplex.com/

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

https://github.com/paulbartrum/jurassic


3
Похоже, что это один из немногих проектов, который имеет как собственный .NET-код (вместо использования, например, движка V8), так и по-прежнему поддерживается (Ecmascript.net, jscript.net и множество других, кажется, мертвых). +1 и спасибо за ссылку!
Атлас

2
После проверки каждого проекта, перечисленного в этих ответах, я остановился на юрском периоде. Это один из двух или трех, которые все еще активно поддерживаются, это настоящий JS, хорошо протестированный и чистый .NET.
Роман Старков

Добавил бы мою поддержку юрского периода. Он также имеет возможность сериализации состояния выполнения контекста выполнения. Это означает, что вы можете буквально сохранить свое время выполнения JavaScript, переменные и все. Чрезвычайно полезная функция для некоторых случаев.
Джером Халтом

Привет, Васаби, я не смог найти ничего о том, как сериализовать состояние выполнения контекста выполнения. Как ты этого добился?
Хеннинг

8

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


В настоящее время мы используем IronJS, но это мертвый проект в наши дни, и компилятор написан на F #, который я могу использовать, но не очень разбираюсь.
rusbishop

7

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

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


На самом деле управляемый JScript - самая близкая вещь к моим потребностям. Я знал, что это было в Silverlight, не знал, что это было выпущено. JScript.NET не вариант. Я действительно не хочу предоставлять пользователям доступ ко всему стеку .NET. Мне просто нужна пара основных встроенных объектов, которые они могут использовать для своих приложений.
апрель

17
Сейчас 2009 год, и управляемый JScript сейчас мертв.
Александр Абрамов

5

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


5

Эй, посмотрите на 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"));

Это работает для .Net объектов. Например: если у меня есть класс Employee, могу ли я передать объект в V8 и управлять объектом Employee из JavaScript?
Джой Джордж Кунджиккуру


5

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

Я создал .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.


4

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

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

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

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


2

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

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


2

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

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

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

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

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



1

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

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

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


2
да, все основные двигатели, как правило, встраиваемые, но слишком много препятствий. изучая руководство по встраиванию, изучая C (++) API ... я надеялся, что уже будет проделана некоторая работа по интеграции. JScript.NET не может быть использован, реальный код написан и выполнен пользователями Интернета.
апрель

1

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

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

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

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

Изменить: создал документацию вики днем.


1

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

ReoScript делает ваше приложение может выполнять JavaScript. Он имеет широкий спектр метонов расширения, таких как SetVariable, Function Extension, использование типа 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 

0

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



0

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


-5

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.