41 votes

À quoi servent les gens JScript.Net?

Je suis intéressé de savoir qui l'utilise JScript.Net et pour ce type d'applications. Chaque fois que je suis en train de lire MSDN .Net de la documentation, j'ai toujours l'avis de la JScript échantillons, mais dans toutes les années où j'ai été un C# dev, je n'ai jamais connu quelqu'un de l'utiliser.

Ce type d'applications sont des gens l'utiliser pour, et comment faut-il mesurer, en termes de souplesse, de puissance et d'utilisation générale, pour C#?

[Edit: Juste pour préciser - je ne suis pas demander à ce que JScript.Net est, je me demande ce que les gens sont réellement utiliser pour l' - c'est à dire intéressé à connaître l'utilisation réelle des scénarios et comment les gens ont trouvé cela fonctionne avec n']

29voto

David M Points 45808

Rob - J'ai utilisé JScript.NET en colère à un endroit de mon code, qui consiste essentiellement à exposer les fonctionnalités de sa méthode eval. Voici une version réduite:

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

Vous pouvez évidemment créer des surcharges pour d'autres types de retour. Je ne peux pas prétendre que l'idée originale était la mienne! Utilisé pour cela, par exemple, pour évaluer une expression de chaîne telle que 3 + 4 à 7 sans analyse d'expression.

15voto

Chris Points 71

Je recommande à tout le monde de ne pas l'utiliser ou seulement à des doses homéopathiques. Malheureusement, je dois travailler beaucoup pour des raisons d'héritage, et comme l'a dit avant il a été développé pour .NET 1.1 et n'a pas été mis à jour depuis, n'a pas de support pour les génériques, pas de support pour les délégués, ne peut pas déclarer d'événements, etc. Il n'a jamais été très répandue et n'est actuellement pas plus développé (bien que parfois, Microsoft toujours corrige un bug je soumettre). Mais c'est le problème mineur: Il y a des problèmes majeurs dans le compilateur de code valides peut se bloquer facilement et puis tout ce que vous avez est une exception, quelque part dans la profondeur de jsc.exe n'y a aucune indication de fichier qui est à l'origine du crash de la laisser seule ligne de code. Voici un exemple de ce qui se fait (j'ai été coulée a fortement tapé tableau en un 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()

Bonne chance si vous avez de trouver le problème avec un tel message.

JScript.NET a certaines caractéristiques qui pourraient être intéressant pour certains projets, comme le prototypage (ajout de nouvelles propriétés et je pense aussi à des méthodes d'une instance existante de n'importe quel objet), a en quelque sorte Lamda-Fonctions déjà depuis .NET 1.1 (peut-être de 1,0), etc. Mais pour atteindre ce comportement totalement différent de ce qui était possible avec .NET 1.1 qu'ils avaient à tout envelopper dans runtime-aides, JScript.NET dispose d'une classe String, qui est converti en Système.Chaîne çà et là à chaque fois que nécessaire. Même avec des tableaux, JScript a sa propre mise en œuvre et a pour les convertir à chaque fois qu'un cadre de la fonction est appelée avec un tableau comme paramètre etc.

Je experiended ces drôles de choses comme ça une requête à la base de données a été exécutée deux fois si j'ai passé directement comme paramètre à une méthode (DoSomething(myRequest.Execute()), le résultat de la requête est de type System.String[][]) mais le tout fonctionne très bien si je affecter le résultat de la première d'une variable et ensuite de le passer à la méthode, ou si vous essayez de trier un tableau avec System.Array.Sort(..) il est tout simplement ignoré et ainsi de suite.

J'ai le sentiment JScript.NET était une étude de cas à la preuve qu'il est également possible d'appliquer des langues très différentes de la philosophie, et Microsoft a donné qu'ils se sont rendu compte que son approche était pas bien choisi, mais ils ont appris la leçon et ont fait un excellent travail avec PowerShell qui a un peu similair philosophie.

Mais pour couper une longue histoire courte: Ne pas utiliser JScript.NET si vous n'en avez pas, utilisez un langage moderne comme C# ou VB.NET au lieu de cela, et si vous avez besoin de la fonctionnalité de script, je recommande d'utiliser CSScript.

7voto

John Knoeller Points 20754

JScript .NET est l'une des langues prises en charge pour l'écriture d'extensions d'application pour Sony de la famille, des médias de produits d'édition. Sound Forge & Vegas.

En particulier, Sound Forge dispose d'une fenêtre que vous pouvez utiliser pour éditer et exécuter des scripts pour manipuler des fichiers audio.

Il s'avère que Microsoft fait c'est assez facile d'ajouter des scripts pour votre application à l'aide d'un (ou l'ensemble) de l' .NET les langues prises en charge. VB, JScript et C#. Juste à juste à exposer quelques objets à partir de votre application et de la main de ces objets (assemblées en fait) pour le compilateur avec l'utilisateur, le texte du script.

Ils ont un forum pour les auteurs de scripts pour Sound Forge

5voto

Torben Poder Points 31

Je l'utilise beaucoup, presque exclusivement, pour ASP.NET et web connexes-stuff.

Vous pouvez l'utiliser pour à peu près tous les trucs que vous pouvez utiliser les autres .NET languages pour. Il fait MSIL, tout comme les autres ;) Compilé avec le "rapide" option qui tourne de certains du javascript natif traits, comme prototype extensions et eval, il effectue tout comme n'importe quel autre code sur le CLR.

Ce n'est certainement pas un membre à part entière de la famille, dans le sens où il semble un peu à gauche derrière dans la .NET 1.1 en termes de fonctionnalités, l'outil de support est inexistant, et la documentation est carrément appaling. C'est en partie pourquoi je l'aime tellement, en fait, me fait me sentir comme je suis de programmation.

Si vous avez beaucoup de (j)les scripts qui traînent, qui doit être converti .NET, c'est le choix évident que vous aurez besoin de très peu de réécriture pour que cela fonctionne. Autrement il n'y a aucune raison particulière de choisir JScript.NET sur une autre .NET de la langue, et de nombreuses raisons de ne pas.

Il s'agit de préférences personnelles, puisque tout finit dans le même code CLR, indépendamment de la langue. Je trouve JScript.NET facile à vivre, naturel d'écrire et d'une grande simplicité, comme aucune autre langue, j'ai essayé, j'ai donc l'utiliser jusqu'à ce que je rencontre un problème que la langue ne peut pas gérer. N'est pas encore arrivé.

4voto

leen Points 1200

Avec la Gestion des Processus d'Affaires de l'outil de Metastorm BPM vous pouvez utiliser JScript.Net pour étendre votre flux de travail. Par exemple, vous pouvez ajouter des .Net .dll pour le moteur et d'interagir avec eux dans vos processus à l'aide de JScript.Net.

Mon expérience a été très positive. J'ai mis en place seulement quelques petites colle des scripts, mais je préfère le script avec JScript.Net pour VBScript (le deuxième de Script pris en charge de la Langue) à tout moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X