Для чего используют JScript.Net?

Мне интересно узнать, кто использует JScript.Net и какие приложения. Всякий раз, когда я читаю документацию MSDN.Net, я всегда замечаю образцы JScript, но за все годы, когда я был разработчиком С#, я никогда не знал, чтобы кто-нибудь использовал его.

Какими приложениями пользуются люди, использующие это, и как они измеряют с точки зрения гибкости, мощности и общего использования на С#?

[ Изменить: Просто чтобы уточнить - я не спрашиваю, что такое JScript.Net, я спрашиваю, что на самом деле используют его люди - то есть интересно знать фактические сценарии использования и как люди нашел, что он работает с]

Ответ 1

Роб. Я использовал JScript.NET в гневе в одном месте в моем коде, что, по сути, раскрывает функциональность его метода eval. Вот вырезанная версия:

static public class Evaluator
{
    private const string _jscriptSource =
        @"package Evaluator
        {
           class Evaluator
           {
              public function Eval(expr : String) : String 
              { 
                 return eval(expr); 
              }
           }
        }";

    static private object _evaluator;
    static private Type _evaluatorType;

    static Evaluator()
    {
        InstantiateInternalEvaluator();
    }

    static private void InstantiateInternalEvaluator()
    {
        JScriptCodeProvider compiler = new JScriptCodeProvider();

        CompilerParameters parameters;
        parameters = new CompilerParameters();
        parameters.GenerateInMemory = true;

        CompilerResults results;
        results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource);

        Assembly assembly = results.CompiledAssembly;
        _evaluatorType = assembly.GetType("Evaluator.Evaluator");

        _evaluator = Activator.CreateInstance(_evaluatorType);
    }

    static public object EvaluateToObject(string statement)
    {
        try
        {
            return _evaluatorType.InvokeMember(
                "Eval",
                BindingFlags.InvokeMethod,
                null,
                _evaluator,
                new object[] {statement}
                );
        }
        catch (Exception)
        {
            InstantiateInternalEvaluator();
            return null;
        }
    }

Очевидно, вы можете создавать перегрузки для других типов возвращаемых данных. Я не могу утверждать, что оригинальная идея была моей! Использование для этого было бы, например, для оценки строкового выражения, такого как 3 + 4 - 7 без синтаксического анализа выражения.

Ответ 2

Я рекомендую всем не использовать его или только в гомеопатических дозах. К сожалению, мне приходится много работать с ним по причинам, связанным с наследием, и, как было заявлено ранее, он был разработан для .NET 1.1 и не был обновлен с тех пор, не имеет поддержки для генериков, поддержки делегатов, не может объявлять события и т.д. Это никогда не было очень распространен и в настоящее время не развит (хотя иногда Microsoft все еще исправляет ошибку, которую я отправляю). Но эта второстепенная проблема: в компиляторе есть серьезные проблемы, допустимый код может легко свернуть его, а затем все, что у вас есть, - это исключение, заброшенное где-то в глубину jsc.exe без намека на то, какой файл вызывает сбой, не говоря уже о том, какая строка кода. Вот пример того, что происходит (я выбрал строго типизированный массив в ICollection):

***INTERNAL COMPILER ERROR***
Microsoft.Vsa.VsaException: InternalCompilerError (0x80133021): System.NotSupportedException: Not supported in a non-reflected type.
   at System.Reflection.Emit.SymbolType.GetMember(String name, MemberTypes type, BindingFlags bindingAttr)
   at System.Type.GetMember(String name, BindingFlags bindingAttr)
   at Microsoft.JScript.Convert.GetToXXXXMethod(IReflect ir, Type desiredType, Boolean explicitOK)
   at Microsoft.JScript.Convert.EmittedCallToConversionMethod(AST ast, ILGenerator il, Type source_type, Type target_type)
   at Microsoft.JScript.Convert.Emit(AST ast, ILGenerator il, Type source_type, Type target_type, Boolean truncationPermitted)
   at Microsoft.JScript.Binding.TranslateToILCall(ILGenerator il, Type rtype, ASTList argList, Boolean construct, Boolean brackets)
   at Microsoft.JScript.Lookup.TranslateToILCall(ILGenerator il, Type rtype, ASTList argList, Boolean construct, Boolean brackets)
   at Microsoft.JScript.Call.TranslateToIL(ILGenerator il, Type rtype)
   at Microsoft.JScript.Binding.TranslateToILSet(ILGenerator il, AST rhvalue)
   at Microsoft.JScript.Lookup.TranslateToILSet(ILGenerator il, Boolean doBoth, AST rhvalue)
   at Microsoft.JScript.VariableDeclaration.TranslateToIL(ILGenerator il, Type rtype)
   at Microsoft.JScript.Block.TranslateToIL(ILGenerator il, Type rtype)
   at Microsoft.JScript.FunctionObject.TranslateToIL(CompilerGlobals compilerGlobals)
   at Microsoft.JScript.FunctionDeclaration.TranslateToILInitializer(ILGenerator il)
   at Microsoft.JScript.Block.TranslateToILInstanceInitializers(ILGenerator il)
   at Microsoft.JScript.Class.TranslateToCOMPlusClass()
   at Microsoft.JScript.Class.TranslateToIL(ILGenerator il, Type rtype)
   at Microsoft.JScript.Package.TranslateToIL(ILGenerator il, Type rtype)
   at Microsoft.JScript.Block.TranslateToIL(ILGenerator il, Type rtype)
   at Microsoft.JScript.ScriptBlock.TranslateToIL(ILGenerator il, Type rtype)
   at Microsoft.JScript.ScriptBlock.TranslateToILClass(CompilerGlobals compilerGlobals, Boolean pushScope)
   at Microsoft.JScript.VsaStaticCode.TranslateToIL()
   at Microsoft.JScript.Vsa.VsaEngine.DoCompile()
   at Microsoft.Vsa.BaseVsaEngine.Compile()

Удачи, если вам нужно найти проблему с таким сообщением.

В JScript.NET есть некоторые функции, которые могут быть интересны для некоторых проектов, например, прототипирование (добавление новых свойств и, как я думаю, также методы к существующему экземпляру любого объекта), имеет вид Lamda-функций уже с .NET 1.1 (возможно 1.0) и т.д. Но для достижения этого совершенно другого поведения из того, что было возможно с .NET 1.1, им пришлось обернуть все в помощниках во время выполнения, JScript.NET имеет собственный класс String, который преобразуется в System.String туда и обратно, когда это необходимо, То же самое с массивами, JScript имеет свою собственную реализацию и должен преобразовывать их всякий раз, когда функция framework вызывается с массивом как параметром и т.д.

Я испытал такие забавные вещи, что запрос к базе данных был выполнен дважды, если я передал его напрямую как параметр методу (DoSomething(myRequest.Execute()), результат запроса был типа System.String[][]), но все это отлично работает, если я сначала передаю результат переменной, а затем передаю ее методу или попытаюсь отсортировать массив с помощью System.Array.Sort(..), это просто игнорируется и т.д.

У меня такое чувство, что JScript.NET был примером для доказательства того, что он также может реализовывать языки с совершенно другой философией, и Microsoft отказалась от них, поскольку они поняли, что его подход не был хорошо выбран, но они извлекли урок и отлично справился с PowerShell, который имеет несколько схожую философию.

Но сократите длинную историю: не используйте JScript.NET, если вам это не нужно, используйте вместо этого современный язык, например С# или VB.NET, и если вам нужны функции сценариев, я рекомендую использовать CSScript.

Ответ 3

JScript.NET является одним из языков, поддерживаемых для написания расширений приложений для семейства продуктов для редактирования мультимедиа. Звук Фордж и Вегас.

В частности, Sound Forge имеет окно, которое вы можете использовать для редактирования и запуска скриптов для управления аудиофайлами.

Оказывается, Microsoft упростила добавление скриптов в ваше приложение с использованием одного (или всех) поддерживаемых .NET языков. VB, JScript и С#. Просто нужно выставить некоторые объекты из вашего приложения и передать эти объекты (сборки на самом деле) в компилятор вместе с текстом пользователя script.

У них есть веб-форум для script писателей для Sound Forge

Ответ 4

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

Вы можете использовать его практически для всего, что вы можете использовать для других языков .NET. Это делает MSIL так же, как и остальные;) Скомпилированный с опцией "быстрый", который превращает некоторые из собственных характеристик javascript, например, прототипов и eval, он выполняет так же, как и любой другой код в CLR.

Это, конечно, не полноценный член семьи, в том смысле, что он, по-видимому, несколько отстает в .NET 1.1 с точки зрения возможностей, поддержка инструмента не существует, а документация совершенно непривлекательна. Эта часть того, почему мне так нравится, на самом деле, заставляет меня чувствовать, что я программирую.

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

Все сводится к личным предпочтениям, поскольку все это заканчивается тем же кодом CLR, независимо от языка. Я нахожу JScript.NET легким, естественным для записи и с гибкой простотой, как никакой другой язык, который я пробовал, поэтому я использую это, пока не столкнусь с проблемой, с которой язык просто не справляется. Еще не произошло.

Ответ 5

С помощью инструмента управления бизнес-процессами Metastorm BPM вы можете использовать JScript.Net для расширения рабочих процессов. Например, вы можете добавить пользовательские .Net.dlls в движок и взаимодействовать с ними в ваших процессах с помощью JScript.Net.

Мой опыт был довольно положительным. Я применил только некоторые небольшие скрипты для склеивания, но я бы предпочел писать скрипты с JScript.Net на VBScript (второй поддерживаемый язык Scripting Language) в любое время.

Ответ 6

Я опаздываю на вечеринку здесь, но я хочу добавить свое сообщение:

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

Я написал веб-службу, где я работаю на С#, но я думаю о переносе на JScript.NET по этим причинам.

Ответ 7

Ну, я пытаюсь использовать его. Я не могу сказать, что я был успешным.

Я не делал много веб-кодирования в любой среде, но вот мои 2 цента.

Я хотел выставить некоторые таблицы базы данных на веб-страницу, поэтому я собрал страницу быстрого ASP (да, да, я знаю), которая вытащила данные из SQL Server и вернула таблицу как объект JSON. Вместо того, чтобы найти сериализатор JSON для VBScript, я просто написал обе стороны в J (ava) script и импортировал json2.js на сервере для обеспечения сериализации. Он отлично работал; Честно говоря, потребовалось меньше часа, чтобы отбросить хорошее представление JSON таблицы, 50 минут которой были бесплодной попыткой заставить JScript импортировать json2.min.js напрямую, а не бросать вокруг него обертки <% %> и переименовывать его json2.min.asp.

Но все говорят, что это больно и неправильно использовать Classic ASP в этот день и возраст, поэтому я пытаюсь заменить мою быструю и грязную реализацию ASP + Jscript + ADO на ASP.NET + Jscript.NET + ADO.NET, После некоторых моментов головокружительной клавиатуры у меня есть ASP.NET v4.0.30319 на IIS6 и есть страница "привет, мир", которая выполняет несколько простых циклов javascript через директиву <@ language = "JScript">. Пока все хорошо.

Я следил за Best Practices здесь, я бы обернул все в классе и т.д., но поскольку я просто пытаюсь выйти из подъездной дороги, я попытался сделать быстрый порт моего существующего кода, который импортирует различные полезные бит Javascript из других файлов с помощью ASP include.

Включение некоторых простых вещей с помощью <--#incude file="somejsconstants.asp" --> отлично работает и позволяет мне получить доступ к константам из этого файла. Но моя попытка вытащить сериализатор JSON с помощью <--#incude file="json2.min.asp" --> не помогла, и выпустила версию json2.js, которая была соответствующим образом изменена, чтобы быть автономной страницей aspx и выбросила ту же ошибку. (Ошибка компилятора Objects of type 'jscript_aspx' do not have such a member.) JScript.NET, похоже, недовольна использованием закрытий, почти вездесущей конструкции в современных библиотеках javascript.

Из опубликованных выше сообщений ясно, что существует множество способов сериализации объектов JSON на платформе .NET, но мое чувство кишки состоит в том, что если JScript.NET barfs на Javascript, написанном Дугласом Крокфордом, то это изворотливый, несовместимый rathole, а не стоит инвестировать время. Я мог бы также следить за массой ASP.NET и использовать С#.

Ответ 8

В качестве улучшения для пакетных файлов и консольных приложений, поскольку он позволяет аккуратную гибридизацию (без ненужного вывода) благодаря своим директивам. Сохраните следующий пример с расширением .bat и проверьте его результат:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

 %~n0.exe %*

endlocal & exit /b %errorlevel%


*/

import System;

Console.WriteLine("hello from jscript.net");

Здесь можно найти несколько примеров.

Ответ 9

Я не знаю, как он сравнивает производительность, но я знаю, что JScript.NET является одним из языков, которые вы можете использовать с Unity 3D.

Ответ 10

JScript.NET - это современный язык сценариев с широким спектром приложений. Это истинный объектно-ориентированный язык, и тем не менее он по-прежнему сохраняет свои "сценарии" . JScript.NET поддерживает полную обратную совместимость с предыдущими версиями JScript, в то же время включает в себя отличные новые функции и обеспечивает доступ к общей языковой среде выполнения и .NET Framework (от JScript. NET).

Кроме того, вы можете найти эту статью stackoverflow также полезной: Может ли JScript.NET использоваться для script.NET-приложения?

Что касается того, кто использует, я честно не знаю (я уверен, что там есть).

Прочитайте Представляем JScript.NET.

Моя личная мысль заключалась в том, что для разработчиков веб-сайтов, которые привыкли писать на простом JScript, может быть очень хорошо, и вы хотите получить преимущества .NET без необходимости изучать новый язык или для тех, кто хочет иметь все свои код, написанный на одном языке.

Ответ 11

Я только предположил, что он использовался Microsoft для раздувания количества языков .NET, поддерживаемых при запуске в маркетинговых целях.

Ответ 12

Страница JScript.NET Wikipedia довольно понятна: http://en.wikipedia.org/wiki/JScript_.NET

Короче говоря, это похоже на JavaScript с библиотекой .NET.