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.