Подтвердить что ты не робот

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

4b9b3361

Ответ 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'.

Мне нужно переписать весь класс. Это сложно...