43 Stimmen

Wofür wird JScript.Net verwendet?

Mich würde interessieren, wer JScript.Net benutzt und für welche Art von Anwendungen. Immer wenn ich die MSDN .Net-Dokumentation lese, fallen mir die JScript-Beispiele auf, aber in all den Jahren, in denen ich C#-Entwickler bin, habe ich noch nie jemanden gekannt, der es benutzt.

Für welche Art von Anwendungen wird es eingesetzt, und wie schneidet es in Bezug auf Flexibilität, Leistung und allgemeine Verwendung im Vergleich zu C# ab?

[ Edita: Nur zur Klarstellung - ich frage nicht, was JScript.Net ist Ich frage, wofür die Leute es tatsächlich benutzen - d.h. ich bin daran interessiert, die tatsächlichen Nutzungsszenarien zu erfahren und wie die Leute damit gearbeitet haben]

31voto

David M Punkte 69725

Rob - Ich habe JScript.NET in Zorn an einer Stelle in meinem Code verwendet, die im Wesentlichen die Funktionalität seiner eval-Methode zu zeigen ist. Hier ist eine gekürzte Version:

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;
        }
    }

Sie können natürlich Überladungen für andere Rückgabetypen erstellen. Ich kann nicht behaupten, dass die ursprüngliche Idee dafür von mir stammt! Eine Anwendung wäre zum Beispiel die Auswertung eines String-Ausdrucks wie 3 + 4 a 7 ohne Parsing des Ausdrucks.

15voto

Chris Punkte 151

Ich empfehle jedem, es nicht oder nur in homöopathischen Dosen zu verwenden. Leider muss ich aus Legacy-Gründen viel damit arbeiten. Wie bereits erwähnt, wurde es für .NET 1.1 entwickelt und seitdem nicht mehr aktualisiert, hat keine Unterstützung für Generics, keine Unterstützung für Delegates, kann keine Ereignisse deklarieren usw. Es war nie sehr weit verbreitet und wird derzeit nicht mehr weiterentwickelt (obwohl Microsoft manchmal noch einen von mir eingereichten Fehler behebt). Aber das ist das kleinere Problem: Es gibt große Probleme im Compiler, gültiger Code kann ihn leicht zum Absturz bringen und dann hat man nur eine Exception, die irgendwo in den Tiefen der jsc.exe geworfen wird, ohne einen Hinweis, welche Datei den Absturz verursacht, geschweige denn welche Codezeile. Hier ist ein Beispiel dafür, was passiert (ich habe ein stark typisiertes Array in eine ICollection gecastet):

***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()

Viel Glück, wenn Sie das Problem mit einer solchen Meldung finden müssen.

JScript.NET hat einige Funktionen, die für einige Projekte interessant sein könnten, wie z.B. Prototyping (Hinzufügen neuer Eigenschaften und ich glaube auch Methoden zu einer bestehenden Instanz eines beliebigen Objekts), hat eine Art von Lamda-Funktionen bereits seit .NET 1.1 (vielleicht 1.0) usw. Aber um dieses völlig andere Verhalten zu erreichen, als es mit .NET 1.1 möglich war, mussten sie alles in Laufzeit-Helfer verpacken, JScript.NET hat eine eigene String-Klasse, die bei Bedarf in System.String hin und her konvertiert wird. Dasselbe gilt für Arrays, JScript hat seine eigene Implementierung und muss sie konvertieren, wenn eine Framework-Funktion mit einem Array als Parameter aufgerufen wird usw.

Ich habe so komische Dinge erlebt, dass eine Anfrage an die Datenbank zweimal ausgeführt wurde, wenn ich sie direkt als Parameter an eine Methode übergeben habe ( DoSomething(myRequest.Execute()) war das Ergebnis der Anfrage vom Typ System.String[][] ), aber das Ganze funktioniert einwandfrei, wenn ich das Ergebnis zuerst einer Variablen zuweise und es dann an die Methode übergebe, oder wenn ich versuche, ein Array mit System.Array.Sort(..) wird sie einfach ignoriert und so weiter.

Ich habe das Gefühl, dass JScript.NET eine Fallstudie war, um zu beweisen, dass es auch möglich ist, Sprachen mit einer ganz anderen Philosophie zu implementieren, und dass Microsoft es aufgegeben hat, als sie merkten, dass der Ansatz nicht gut gewählt war. Aber sie haben die Lektion gelernt und mit PowerShell, das eine ähnliche Philosophie hat, hervorragende Arbeit geleistet.

Aber um es kurz zu machen: Verwenden Sie nicht JScript.NET, wenn Sie es nicht müssen, sondern eine moderne Sprache wie C# oder VB.NET, und wenn Sie Skriptfunktionen benötigen, empfehle ich CSScript.

7voto

John Knoeller Punkte 32285

JScript .NET ist eine der Sprachen, die für das Schreiben von Anwendungserweiterungen für die Medienbearbeitungsprodukte von Sony unterstützt werden. Sound Forge & Vegas.

Sound Forge verfügt insbesondere über ein Fenster, in dem Sie Skripte zur Bearbeitung von Audiodateien bearbeiten und ausführen können.

Es stellt sich heraus, dass Microsoft es ziemlich einfach gemacht hat, Skripting zu Ihrer Anwendung hinzuzufügen, indem Sie eine (oder alle) der von .NET unterstützten Sprachen verwenden. VB, JScript und C#. Sie müssen nur einige Objekte aus Ihrer Anwendung freilegen und diese Objekte (eigentlich Assemblies) zusammen mit dem Skripttext des Benutzers an den Compiler übergeben.

Sie haben ein Webforum für Drehbuchautoren für Sound Forge

7voto

Torben Poder Punkte 51

Ich benutze es ziemlich viel, fast ausschließlich, für ASP.NET und verwandte Web-Sachen.

Man kann sie für so ziemlich alles verwenden, wofür man auch die anderen .NET-Sprachen verwenden kann. Es macht MSIL, genau wie die anderen ;) Kompiliert mit der Option "fast", die einige der nativen Javascript-Eigenschaften, wie Prototyp-Erweiterungen und eval ausschaltet, funktioniert es wie jeder andere Code in der CLR.

Es ist sicherlich kein vollwertiges Mitglied der Familie, in dem Sinne, dass es in Bezug auf die Funktionen in .NET 1.1 etwas zurückgeblieben zu sein scheint, die Werkzeugunterstützung ist nicht existent und die Dokumentation ist geradezu erschreckend. Das ist einer der Gründe, warum ich es so sehr mag, es gibt mir das Gefühl, dass ich programmiere.

Wenn Sie eine Menge (J)Skripte herumliegen haben, die nach .NET konvertiert werden müssen, ist dies die offensichtliche Wahl, da Sie in der Regel nur sehr wenig umschreiben müssen, damit das funktioniert. Ansonsten gibt es keinen besonderen Grund, JScript.NET einer anderen .NET-Sprache vorzuziehen, und viele Gründe, es nicht zu tun.

Alles ist eine Frage der persönlichen Vorlieben, da es sich unabhängig von der Sprache immer um denselben CLR-Code handelt. Ich finde JScript.NET leichtgängig, natürlich zu schreiben und mit einer flexiblen Einfachheit wie keine andere Sprache, die ich versucht habe, so dass ich das verwenden, bis ich ein Problem, das die Sprache einfach nicht behandeln kann. Das ist bisher noch nicht passiert.

4voto

leen Punkte 7580

Mit dem Werkzeug Business Process Management Metasturm BPM können Sie JScript.Net verwenden, um Ihre Arbeitsabläufe zu erweitern. So können Sie beispielsweise benutzerdefinierte .Net.dlls zur Engine hinzufügen und mit ihnen in Ihren Prozessen über JScript.Net interagieren.

Meine Erfahrungen waren recht positiv. Ich habe nur einige kleine Glue-Skripte implementiert, aber ich würde das Skripting mit JScript.Net jederzeit VBScript (der zweiten unterstützten Skriptsprache) vorziehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X