什么人使用JScript.Net?

时间:2009-12-13 13:25:10

标签: .net asp.net jscript.net

我很想知道谁使用JScript.Net以及使用什么类型的应用程序。 每当我阅读MSDN .Net文档时,我总会注意到JScript示例,但多年来我一直是C#dev,我从来没有真正知道任何人使用它。

人们使用它的哪种应用程序,以及它在C#的灵活性,功能和一般用途方面的衡量标准?

[编辑:只是为了澄清 - 我不是在问什么是JScript.Net ,我问的是人们实际使用它的是什么 - 即有兴趣了解实际使用场景以及人们如何找到它[] p

12 个答案:

答案 0 :(得分:27)

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 + 47之类的字符串表达式。

答案 1 :(得分:12)

我建议所有人不要使用它或仅用于顺势疗法。遗憾的是,由于遗留原因,我必须对它进行大量工作,正如之前所说的那样,它是为.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以来就已经有了一些Lamda-Functions(也许) 1.0)等但是为了达到与.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。

答案 2 :(得分:6)

JScript .NET是为Sony的媒体编辑产品系列编写应用程序扩展所支持的语言之一。 Sound Forge&拉斯维加斯。

特别是Sound Forge有一个窗口,您可以使用该窗口编辑和运行脚本来操作音频文件。

事实证明,微软很容易使用一种(或所有).NET支持的语言向您的应用程序添加脚本。 VB,JScript& C#。只需要从应用程序中公开一些对象,并将这些对象(实际上是程序集)与用户的脚本文本一起交给编译器。

他们有script writers for Sound Forge

的网络论坛

答案 3 :(得分:4)

我非常使用它,几乎完全用于ASP.NET和相关的web-stuff。

您可以将它用于几乎所有可以使用其他.NET语言的东西。它就像其他人一样制作MSIL;)使用“快速”选项进行编译,转换一些原生javascript特性,如原型扩展和eval,它的表现就像CLR上的任何其他代码一样。

它肯定不是这个家族中的一个成熟的成员,因为它在功能方面似乎有点落后于.NET 1.1,工具支持是不存在的,而且文档是完全适用的。这就是为什么我非常喜欢它的原因,实际上,这让我觉得我正在编程。

如果你有许多(j)脚本需要转换为.NET,这是显而易见的选择,因为你通常需要很少的重写才能工作。否则,没有特别的理由选择JScript.NET而不是任何其他.NET语言,并且有许多理由不这样做。

这一切都归结为个人偏好,因为它最终都是相同的CLR代码,无论语言如何。我发现JScript.NET易于使用,编写自然,并且具有灵活的简单性,就像我尝试过的其他语言一样,所以我使用它直到遇到语言无法处理的问题。还没有发生。

答案 4 :(得分:3)

使用业务流程管理工具Metastorm BPM,您可以使用JScript.Net扩展您的工作流程。例如,您可以将自定义.Net .dll添加到引擎,并使用JScript.Net在流程中与它们进行交互。

我的经历非常积极。我只实现了一些小的胶水脚本,但我更喜欢随时使用JScript.Net脚本编写VBScript(第二种支持的脚本语言)。

答案 5 :(得分:3)

好吧,我尝试使用它。我不能说我成功了。

我在任何环境中都没有做过很多网页编码,但这是我的2美分。

我想将一些数据库表暴露给一个网页,所以我把一个快速的经典ASP(是的,是的,我知道)页面放在一起,从SQL Server中提取数据并将表作为JSON对象返回。我没有为VBScript定位JSON序列化程序,而是在J(ava)脚本中编写了双方,并在服务器上导入了json2.js以提供序列化。它工作得很好;老实说,它花了不到一个小时的时间让它吐出一个漂亮的桌面JSON表示,其中50分钟是徒劳无功的尝试让JScript直接导入json2.min.js而不是在它周围抛出<% %>包装器并重命名为json2.min.asp

但是每个人都说在这个时代使用Classic ASP是生病和错误的,所以我正在尝试更换我的快速&amp;使用ASP.NET + Jscript.NET + ADO.NET实现脏ASP + Jscript + ADO。在一些令人头疼的键盘时刻之后,我在IIS6上安装了ASP.NET v4.0.30319并且有一个“hello,world”页面,通过<@ language = "JScript">指令执行一些简单的循环javascript。到目前为止一切都很好。

我在这里遵循最佳实践我会将所有内容包装在一个类等中,但是因为我只是试图离开车道我尝试快速移植现有代码,导入各种有用的部分使用ASP include语句从其他文件中获取Javascript。

使用<--#incude file="somejsconstants.asp" -->包含一些简单的东西工作得很好,让我从该文件中访问常量。但是我试图用<--#incude file="json2.min.asp" -->引入JSON序列化程序不起作用,并且启动了json2.js版本被适当修改为独立的aspx页面并引发了同样的错误。 (编译器错误是Objects of type 'jscript_aspx' do not have such a member。)JScript.NET似乎对使用闭包感到不满,闭包是当今javascript库中几乎无处不在的构造。

从上面的帖子中可以看出,有很多方法可以在.NET平台中序列化JSON对象,但我的直觉是,如果JScript.NET barfs在Javascript上由Douglas Crockford编写,那么它就是一个古怪,不兼容的rathole而不是值得我投入时间。我不妨关注ASP.NET群众并使用C#。

答案 6 :(得分:2)

我在这里参加派对很晚,但我想补充一下:

我认为JScript.NET对服务器端代码很有用。使用服务器端的东西与使用客户端的东西基本相同是很自然的。此外,如果您正在创建通过JSON进行通信的Web服务,它可以更轻松地使用JSON。

我写了一个Web服务,我在C#中工作,但由于这些原因,我正在考虑迁移到JScript.NET。

答案 7 :(得分:2)

作为批处理文件和控制台应用程序的增强,因为它允许整齐的杂交(没有不必要的输出),这要归功于它的指令。保存以下带有.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");

此处some examples can be found

答案 8 :(得分:1)

我不知道它在性能方面有何比较,但我知道JScript.NET是可以与Unity 3D一起使用的语言之一。

答案 9 :(得分:-1)

JScript .NET是一种现代脚本语言,具有各种各样的应用程序。它是一种真正的面向对象语言,但仍然保持其“脚本”感觉。 JScript .NET保持与以前版本的JScript的完全向后兼容性,同时包含强大的新功能并提供对公共语言运行库和.NET Framework的访问(来自JScript.NET)。

此外,您可能会发现此stackoverflow帖子也有帮助: Can JScript.NET be used to script a .NET application?

至于谁在使用,我老实说不知道(我很确定那里有)。

阅读Introducing JScript.NET

我个人的想法是,对于习惯于使用简单的JScript编写并希望获得.NET的好处而不需要学习新语言的Web开发人员,或者想要拥有所有他们所有人的人来说,这可能是非常棒的。用一种语言编写的代码。

答案 10 :(得分:-2)

我只是假设微软使用它来扩展.NET在发布时支持的语言数量以用于营销目的。

答案 11 :(得分:-3)

JScript.NET维基百科页面非常简洁:http://en.wikipedia.org/wiki/JScript_.NET

简而言之,似乎是.NET库中的JavaScript。