我很想知道谁使用JScript.Net以及使用什么类型的应用程序.每当我阅读MSDN .Net文档时,我总会注意到JScript示例,但多年来我一直是C#dev,我从来没有真正知道任何人使用它.
人们使用它的是什么类型的应用程序,以及它在灵活性,功能和一般使用方面如何衡量C#?
[ 编辑:只是为了澄清 - 我不是在问JScript.Net 是什么,我问的是人们实际使用它是什么 - 即有兴趣知道实际的使用场景以及人们如何找到它的工作方式]
Rob - 我在我的代码中的一个地方愤怒地使用了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
没有表达式解析的情况下评估字符串表达式.
我建议所有人不要使用它或仅用顺势疗法剂量.遗憾的是,由于遗留原因,我必须对它进行大量工作,正如之前所说的那样,它是为.NET 1.1开发的,因为没有升级,不支持泛型,不支持代表,不能声明事件等.它从来没有非常普遍,目前还没有开发(虽然有时微软仍然修复了我提交的错误).但这是次要的问题:编译器中存在重大问题,有效代码可能会轻易崩溃,然后你所拥有的只是在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有一些功能可能对某些项目很有意思,比如原型设计(添加新属性,我认为还有任何对象的现有实例的方法),自.NET 1.1(可能是1.0)以来已经有一种Lamda-Functions但是为了达到与.NET 1.1可能完全不同的行为,它们必须将所有内容包装在运行时助手中,JScript.NET有一个自己的String类,可以在需要时来回转换为System.String.与数组相同,JScript有自己的实现,只要使用数组作为参数调用框架函数,就必须转换它们.
我经历过如此有趣的事情,如果我将数据库的请求作为参数直接传递给方法(DoSomething(myRequest.Execute())
请求的结果是类型System.String[][]
),那么对数据库的请求执行了两次但是如果我先分配结果,整个过程都正常工作到一个变量,然后将它传递给该方法,或者如果您尝试使用System.Array.Sort(..)
它对数组进行排序,则会被忽略,依此类推.
我感觉JScript.NET是一个案例研究,证明它也可以实现具有非常不同的哲学的语言,并且微软放弃了,因为他们意识到它的方法没有被很好地选择,但是他们吸取了教训并且做了一个PowerShell的优秀工作,有一个类似的哲学.
但简而言之:如果不必使用JScript.NET,请使用C#或VB.NET等现代语言,如果需要脚本功能,我建议使用CSScript.
JScript .NET是为Sony的媒体编辑产品系列编写应用程序扩展所支持的语言之一.Sound Forge和拉斯维加斯.
特别是Sound Forge有一个窗口,您可以使用该窗口编辑和运行脚本来操作音频文件.
事实证明,微软很容易使用一种(或所有).NET支持的语言向您的应用程序添加脚本.VB,JScript和C#.只需要从应用程序中公开一些对象,并将这些对象(实际上是程序集)与用户的脚本文本一起交给编译器.
他们为Sound Forge提供了一个脚本编写者的网络论坛
我在ASP.NET和相关的Web东西上使用了很多(几乎全部)。
您几乎可以将它用于所有其他.NET语言可以使用的东西。它使MSIL像其他语言一样;)与“快速”选项一起编译,该选项转换了某些本机javascript特性,例如原型扩展和eval,它的性能与CLR上的任何其他代码相同。
从某种意义上说,它在.NET 1.1中似乎有些滞后,对工具的支持不复存在,对文档的要求也不高,因此它肯定不是该系列的正式成员。这就是为什么我如此喜欢它的部分原因,实际上让我觉得自己在编程。
如果有很多(j)脚本需要转换为.NET,则这是显而易见的选择,因为通常只需很少的重写即可工作。否则,没有其他任何.NET语言选择JScript.NET的特殊原因,并且有很多理由不这样做。
这一切都归因于个人喜好,因为所有语言最终都成为相同的CLR代码,而与语言无关。我发现JScript.NET易于使用,编写自然且具有灵活的简洁性,这是我尝试过的其他语言所没有的,因此我会一直使用它,直到遇到该语言无法处理的问题。还没发生