Вбудований двигун JavaScript у .NET [закрито]


217

просто цікаво, чи хтось коли-небудь намагався вбудовувати та фактично інтегрувати будь-який js-движок у середовище .net. Я міг би знайти і на самому справі використовувати (після ЛОТ болю і зусиль, так як це досить застарілою і не зовсім закінчений) SpiderMonkey-DotNet проект. Хтось із досвідом у цій галузі? Такі двигуни, як SquirrelFish, V8 ..

Не те, що мене не влаштовує Spidermonkey Mozilla (використовуючи його для міні-рамки, подібної до 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 #.

Відповіді:


98

Спробуйте Javascript .NET . Він розміщений на GitHub Спочатку розміщувався на CodePlex, тут )

Обговорення проекту: http://javascriptdotnet.codeplex.com/discussions

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


+1. Це просто, і, здається, працює чудово.
JC Inacio

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 Script для .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 - це незалежність мови. Неважливо, якою мовою написана бібліотека, для того, щоб ви її використовували.
marc hoffman

1
Останній реліз у 2011 році ... Jurassic здається кращим.
Роман Старков

3
Останній реліз у 2014 році фактично: github.com/sebastienros/jint
Sébastien Ros - 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 - це.
Brain2000

Ось моя проблема з ClearScript. Під час запуску він скаржиться, що відсутні збитки. Потім мене просять встановити додаткові візуальні компоненти студії. Це не проблема, крім того, що я не матиму привілею адміністратора, де я запускатиму код. Було б непогано, якби це було повністю самостійно, що міститься в dll.
TatiOverflow

38

Хтось лише налаштовується на перевірку юрського періоду:

http://jurassic.codeplex.com/

редагувати: це перемістилося до github (і здається активним на перший погляд)

https://github.com/paulbartrum/jurassic


3
Здається, це один з небагатьох проектів, у якого є і рідний .NET-код (замість використання f.ex. двигуна V8), і все ще, здається, підтримується (Ecmascript.net, jscript.net і ще безліч інших, здається, є мертвий). +1 і спасибі за посилання!
atlaste

2
Перевіривши кожен проект, зазначений у цих відповідях, я придумав Юраського періоду. Це один із двох-трьох, які все ще активно підтримуються, це справжній JS, високо перевірений і чистий .NET.
Роман Старков

Додав би мою підтримку Юрського періоду. Він також має можливість серіалізувати стан запуску контексту виконання. Це означає, що ви можете буквально зберігати час виконання JavaScript, змінні та все. Надзвичайно корисна функція для деяких випадків.
Джеронім Халтом

Привіт васабі, я не зміг знайти нічого про те, як серіалізувати стан запуску контексту виконання. Як ви цього домоглися?
Кеннінг

8

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


Зараз ми використовуємо IronJS, але це мертвий проект у наші дні, і компілятор написаний на F #, до якого я можу ввімкнути, але не маю досвіду.
russbishop

7

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

Особисто я думав, що було б здорово якось інтегрувати V8, але не завантажував завантаження вихідного коду; хотілося б, щоб я мав час насправді щось зробити з цим.


насправді керований JScript - це найбільш близька до моїх потреб. Я знав, що це було в Silverlight, не знав, що його випустили. JScript.NET - це не варіант. Я дійсно не хочу надавати користувачам доступ до всього стека .NET. Мені просто потрібно кілька основних вбудованих об'єктів, які вони можуть використовувати для своїх додатків.
квітня

17
Настав 2009 рік, а керований JScript зараз мертвий.
Олександр Абрамов

5

Якщо мова не є проблемою (будь-яка сценарій з пісочним сценарієм), LUA для .NET . Версія Silverlight рамки .NET також є піксельним afaik.


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 об'єктів. Наприклад: Якщо у мене клас "Співробітник", чи можу я передати об'єкт V8 та маніпулювати об'єктом Співробітник з 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 для .Net .

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

Отже: Простота у використанні та налаштуванні, але не дуже допомагає для складних сценаріїв.

Також необхідність встановити щось замість того, щоб просто скидати збірки в каталог, є негативним для мене ...


2

Задокументований спосіб Microsoft додати розширюваність сценарію ні до чого - IActiveScript. Ви можете використовувати IActiveScript з будь-якого додатка .NET для виклику логіки сценарію. Логіка може розміщуватись на об’єктах .NET, які ви розмістили в контексті сценаріїв.

Ця відповідь надає програмі, яка це робить, з кодом:


2

Тут доступна реалізація хоста двигуна сценарію ActiveX в C #, доступного тут: проаналізувати та виконати JS за допомогою C #

Це дозволяє використовувати Javascript (або VBScript) безпосередньо з C #, в нативних 32-бітних або 64-бітних процесах. Повне джерело становить ~ 500 рядків коду C #. Він має лише неявну залежність від встановленого JScript (або VBScript) двигуна DLL.

Наприклад, наступний код:

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
так, всі основні двигуни, як правило, вбудовані, але перешкод просто занадто багато. вивчаючи посібник із вбудовування, вивчаючи API C (++) .. Я сподівався, що вже буде зроблена якась робота з інтеграції. 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 Type, .Net Event Binding та ін.

Привіт Світ:

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

Ось приклад сценарію, який створює форму виграшу та показує її.

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.