Существуют ли какие-либо .NET CLR/DLR реализации ECMAScript?
Кто-нибудь знает о реальных (i.. no steamware) реализациях ECMAScript, нацеленных на .NET CLR/DLR? В идеале что-то вроде , что Rhino для Java. Яркий порт Rhino, работающий на платформе .NET Framework/Mono Framework, был бы идеальным.
Я видел только несколько упомянутых проектов, но никогда не видел, чтобы кто-либо обнаружил или на самом деле все, что я когда-либо мог запустить script. Вот о чем я уже знаю:
-
MSScriptControl ActiveX Control: AFAIK, это был последний реальный проект, совместимый с ECMAScript JScript 5.7). Я интегрирован с MSScriptControl, но не рассматриваю COM-взаимодействие как ответ на этот вопрос. x64 - это убийца для этой опции.
-
JScript.NET: я не считаю JScript.NET, поскольку он никогда не смог успешно проанализируйте любой из моих реальных сценариев. Кажется, у него проблемы с закрытием.
-
Управляемый JScript: похоже, что я хочу, но он, кажется, мертв в воде, Это был крупный пример реализации DLR, но затем запутался с SilverLight и, похоже, исчез в качестве приоритета с 2007 года. Полезные источники о статусе этого были бы полезны.
-
MyJScript. Построен как реализация учебника для DLR. Кто-нибудь знает, насколько завершена реализация?
-
Jint: интерпретатор JavaScript для .NET. Пока еще не поддерживает Currying или try
- catch
- finally
.
-
RemObjects script для .NET: интересный соперник все еще работает. Я смущен их маркетингом относительно того, что это будет на самом деле, но похоже, что в конечном итоге это может пригодиться. Если кто-то знает больше об этом, это тоже будет полезно.
-
V8 для .NET. Это было бы здорово, если бы кто-то портировал V8 на .NET. Насколько я знаю, в этом нет больших усилий. Ссылка на идею вызова в нее из управляемой С++-оболочки.
Для фона, я хочу, чтобы иметь возможность выполнять JavaScript из .NET; т.е. загрузить набор сценариев в контекст и вызвать в этот контекст и получить результаты выполнения. В настоящее время я прыгаю через обручи, чтобы использовать MSScriptControl через громоздкий COM Interop. Несогласованность COM делает его очень трудным для развертывания и обеспечения последовательного выполнения.
Я хотел бы иметь возможность выполнять достаточно сложные тестовые жгуты JavaScript из .NET. Это не для создания пользовательских макросов или простых крошечных скриптов; Мне нужна настоящая среда JavaScript, такая как Rhino. Если реализация выполнялась поверх CLR (а не COM), это действительно помогло бы с некоторыми из текущих проблем.
Ответы
Ответ 1
В настоящее время я изменил версию EcmaScript.NET внутри моего YUICompressor.NET (проект).
Если вы возьмете здесь исходный код, я включил в проект модифицированный код, который вы можете использовать. Это единственный источник кода, который я нашел в .NET, который может обрабатывать разбор javascript на стороне сервера.
К сожалению, я не могу вспомнить, как я наконец нашел его. Должен признаться, это был сложный процесс. Я думаю, что нашел некоторые ссылки на страницы Mozilla dev где-то о Rhino (java-код), которые привели меня к выводу о том, что внедрение С#.NET.
Мне пришлось немного модифицировать его, чтобы синхронизировать с некоторыми изменениями, которые парни YUI Compressor сделали с их ветвью кода. Таким образом, измененная ветка, возможно, не самая лучшая, но она ближе всего к исходной ветке Java.
Оригинальный код С# для EcmaScript.NET не был затронут с 2007 года... по крайней мере, для страницы загрузки.
Возможно, это может помочь?
НТН.
Ответ 2
Никто не упомянул юрский http://jurassic.codeplex.com/
Я не знаю, насколько он хорош в целом (производительность, удобство использования и т.д.), Но по крайней мере он анализирует довольно сложные скрипты (другие реализации не работают), и он поддерживает спецификацию ECMAScript 5. Я просто добавляю ссылку сюда для справки.
Ответ 3
Еще грубо жив:
- Jurassic (Если в течение последнего года было зафиксировано.)
- Jint (в настоящее время принимаются запросы на загрузку.)
Другие проекты, в основном мертвые:
Сумасшедший метод:
- Rhino over IKVM (Упоминается в комментариях, но здесь ссылка на дополнительную информацию об этом.)
Ответ 4
Вы можете взглянуть на Jint (http://jint.codeplex.com), который является интерпретатором ECMAScript с открытым исходным кодом.
Обновление
Недавно переписанная версия доступна на Github по адресу https://github.com/sebastienros/jint
Ответ 5
Никто не упоминает ClearScript, поэтому ClearScript.
Это не реализация; это оболочка interop, которая поддерживает 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);
}
Ответ 6
Вы должны попробовать Javascript.NET(http://javascriptdotnet.codeplex.com/) на Codeplex. Они завернули v8 с управляемым С++, а затем вы можете использовать эту библиотеку с .NET-приложением, и это работает как шарм. С открытым исходным кодом вы найдете несколько хороших функций, если вы спросите меня.
Приветствия.
Ответ 7
Вы можете использовать Jscript.net, и он действительно будет работать с произвольным кодом javascript; Вам просто нужно отключить "быстрый режим" путем компиляции с помощью jsc /fast- bar.js
Я не тестировал это; Я просто заметил это, читая этот пост и понял, что это будет еще одно разумное решение. MSDN имеет документы для этой опции и какие ограничения существуют, если вы не используете " t используйте его.
Ответ 8
V8.NET
Этот, наверное, самый лучший, с которым я столкнулся.
https://v8dotnet.codeplex.com/documentation
Плюс к этому он был построен с самого начала с портом Mono.
Это дает вам полный контроль над мощностью двигателя V8 от управляемого кода.
Ответ 9
Я предпочитаю JINT, а не
другие.
JINT может быть медленным, но его легко отлаживать и взаимодействовать с вашими собственными .NET-классами.
(Трудно установить атрибуты [ComVisile]
каждый раз для jscript.dll и т.д.).
В терминах потоковой обработки JINT и Jurassic работают так, как я ожидал. Чтобы работать с движком JScript или Google V8, вы должны обратить внимание на проблему с потоками UI.
Однако JINT устарел в некотором аспекте, потому что мне сложно скомпилировать JQuery 1.5 или новее.
Я надеюсь, что Юрасси может удалить свой лимит, чтобы придерживаться своего класса, с которым можно работать, создав 'AllowBob'sCLRClass=true'
.
Мне нужно переписать весь класс. Это сложно...