Существуют ли какие-либо реализации.NET CLR/DLR в ECMAScript?
Кто-нибудь знает о реальных (то есть, не испорченных) реализациях ECMAScript, нацеленных на .NET CLR / DLR? В идеале что-то вроде того, что Rhino для Java. Твердый порт Rhino, работающий на.NET Framework / Mono Framework, был бы идеальным.
Я видел только несколько упомянутых проектов, но никогда не видел ни одного из обнаруженных или, в действительности, ничего такого, на чем мне когда-либо удавалось запустить сценарий. Вот что я уже знаю:
Элемент управления ActiveX MSScriptControl: AFAIK, это была последняя реальная реализация Microsoft, совместимая с ECMAScript (работает на JScript 5.7). Я интегрировал с MSScriptControl, но не считаю COM-взаимодействие ответом на этот вопрос. x64 - убийца для этой опции.
JScript.NET: Я не считаю JScript.NET, поскольку он никогда не сможет успешно проанализировать ни один из моих настоящих сценариев. Кажется, есть проблемы с замыканиями.
Управляемый JScript: звучит как то, что я хочу, но кажется, что он мертв в воде. Это был основной пример реализации для DLR, но затем он запутался в SilverLight и, по-видимому, с 2007 года стал приоритетным. Достоверные источники информации о статусе этого были бы полезны.
MyJScript: построен как учебная реализация для DLR. Кто-нибудь знает, насколько полная реализация это?
Jint: интерпретатор JavaScript для.NET.
Пока не поддерживает карри илиtry
-catch
-finally
,Сценарий RemObjects для.NET: интересный соперник еще в разработке. Я смущен их маркетингом относительно того, что это будет на самом деле, но похоже, что в конечном итоге это может подойти. Если кто-то знает больше об этом, это также будет полезно.
V8 для.NET: Было бы здорово, если бы кто-то перенес V8 на.NET. Насколько я знаю, в этом нет больших усилий. Ссылка на идею для вызова из управляемой оболочки C++.
Для фона я хочу иметь возможность выполнять JavaScript из.NET; т.е. загрузить набор сценариев в контекст и вызвать в этом контексте и получить результаты выполнения. В настоящее время я прыгаю через обручи, чтобы использовать MSScriptControl через громоздкие COM-взаимодействия. Несоответствие COM делает его действительно сложным для развертывания и обеспечения согласованного выполнения.
Я хотел бы иметь возможность выполнять достаточно сложные тесты JavaScript изнутри.NET. Это не для создания пользовательских макросов или простых крошечных скриптов; Мне нужна настоящая JavaScript-среда, такая как Rhino. Если бы реализация работала поверх CLR (а не COM), это действительно помогло бы решить некоторые из текущих проблем.
9 ответов
В настоящее время я изменил версию EcmaScript.NET внутри своего порта YUICompressor.NET (проект).
Если вы возьмете исходный код отсюда, я включил мой измененный код в проект, на который вы можете ссылаться. Это единственный источник кода, который я нашел в.NET, который может обрабатывать javascript на стороне сервера.
К сожалению, я не могу вспомнить, как я наконец нашел это. Должен признать, это был сложный процесс. Я думаю, что нашел где-то ссылки на страницы разработчиков Mozilla о Rhino (код Java), которые привели меня к тому, что я понял, что такое C# .NET.
Мне пришлось немного изменить его, чтобы синхронизировать с некоторыми изменениями, которые ребята из YUI Compressor внесли в свою ветвь кода. Таким образом, измененная ветвь, которая у меня есть, может быть не самой лучшей... но она ближе всего к исходной ветке Java.
Оригинальный код C# для EcmaScript.NET не затрагивался с 2007 года... по крайней мере, для страницы загрузок.
Может быть, это может помочь??
НТН.
Все еще примерно жив:
- Юрский (Имел коммит в течение последнего года.)
- Jint (в настоящее время принимает запросы на извлечение.)
Другие проекты, в основном мертвые:
- IronJS: реализация JS, размещенная в DLR; IronJS Google Group. (Последний коммит был в 2013 году, последнее обновление блога в 2012 году.)
- Управляемый JScript: Умер на корню.
- MyJScript: упоминается в оригинальном сообщении, для тех, кто хочет получить больше информации, есть статья: создайте свой собственный язык поверх DLR.
- MonoJS: У Mono была реализация JScript.Net, но они перестали беспокоиться.
Сумасшедший метод:
- Носорог над IKVM (упоминается в комментариях, но вот ссылка на дополнительную информацию о том, как это сделать.)
Никто не упомянул юрский http://jurassic.codeplex.com/ Я не знаю, насколько он хорош в целом (производительность, удобство использования и т. Д.), Но, по крайней мере, он анализирует довольно сложные сценарии (другие реализации этого не делают) и поддерживает ECMAScript 5. спекуляция Я просто добавляю ссылку сюда для справки.
Никто не упомянул ClearScript, так что ClearScript.
Это не реализация; это оболочка взаимодействия, поддерживающая V8, JScript и VBScript, с действительно хорошим API для вызова их из кода.NET.
Пример кода со страницы CodePlex:
using System;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;
// create a script engine
using (var engine = new V8ScriptEngine())
{
// expose a host type
engine.AddHostType("Console", typeof(Console));
engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");
// expose a host object
engine.AddHostObject("random", new Random());
engine.Execute("Console.WriteLine(random.NextDouble())");
// expose entire assemblies
engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));
engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");
// create a host object from script
engine.Execute(@"
birthday = new lib.System.DateTime(2007, 5, 22);
Console.WriteLine(birthday.ToLongDateString());
");
// use a generic class from script
engine.Execute(@"
Dictionary = lib.System.Collections.Generic.Dictionary;
dict = new Dictionary(lib.System.String, lib.System.Int32);
dict.Add('foo', 123);
");
// call a host method with an output parameter
engine.AddHostObject("host", new HostFunctions());
engine.Execute(@"
intVar = host.newVar(lib.System.Int32);
found = dict.TryGetValue('foo', intVar.out);
Console.WriteLine('{0} {1}', found, intVar);
");
// create and populate a host array
engine.Execute(@"
numbers = host.newArr(lib.System.Int32, 20);
for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; }
Console.WriteLine(lib.System.String.Join(', ', numbers));
");
// create a script delegate
engine.Execute(@"
Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean);
oddFilter = new Filter(function(value) {
return (value & 1) ? true : false;
});
");
// use LINQ from script
engine.Execute(@"
oddNumbers = numbers.Where(oddFilter);
Console.WriteLine(lib.System.String.Join(', ', oddNumbers));
");
// call a script function
engine.Execute("function print(x) { Console.WriteLine(x); }");
engine.Script.print(DateTime.Now.DayOfWeek);
// examine a script object
engine.Execute("person = { name: 'Fred', age: 5 }");
Console.WriteLine(engine.Script.person.name);
}
Вы можете взглянуть на Jint ( http://jint.codeplex.com/), который является интерпретатором ECMAScript с открытым исходным кодом.
Обновить
Недавно переписанная версия доступна на Github по адресу https://github.com/sebastienros/jint
Вы должны попробовать Javascript.NET ( http://javascriptdotnet.codeplex.com/) на Codeplex. Они обернули V8 с управляемым C++, а затем вы можете использовать эту библиотеку с приложением.NET, и она работает как шарм. Открытый источник предлагает некоторые довольно хорошие функции, если вы спросите меня.
Приветствия.
Вы можете использовать Jscript.net, и он будет работать с произвольным кодом JavaScript; Вам просто нужно отключить "быстрый режим" путем компиляции с jsc /fast- bar.js
Я не проверял это; Я только заметил это, читая этот пост, и подумал, что это будет другое разумное решение. В MSDN есть документы для этой опции и ограничения, если вы ее не используете.
V8.NET
Этот, наверное, самый лучший, с которым я когда-либо сталкивался.
https://v8dotnet.codeplex.com/documentation
Кроме того, он был построен с самого начала с учетом моно порта. Это дает вам полный контроль над мощностью двигателя V8 из управляемого кода.
Я предпочитаю JINT, чем другие.
JINT может быть медленным, но его легко отлаживать и взаимодействовать с вашими собственными классами.NET.
(Это трудно установить [ComVisile]
атрибуты каждый раз для jscript.dll и т. д.).
С точки зрения потоков, JINT и юрского периода работают, как я и ожидал. Чтобы работать с движком JScript или Google V8, вы должны обратить внимание на проблему потоков в пользовательском интерфейсе.
Тем не менее, JINT устарел в некоторых аспектах, потому что у меня проблемы с компиляцией JQuery 1.5 или более поздней версии.
Я надеюсь, что Jurassic может снять свой предел, чтобы придерживаться своего собственного класса для работы, создав 'AllowBob'sCLRClass=true'
,
Я должен переписать весь класс. Это трудно...