42

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

人们将它用于什么类型的应用程序,以及它如何衡量 C# 的灵活性、功能和一般用途?

[编辑:澄清一下——我不是在问 JScript.Net什么,我是在问人们实际使用它的目的——即有兴趣了解实际使用场景以及人们如何发现它可以使用]

4

12 回答 12

31

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不解析表达式的情况下评估字符串表达式。

于 2009-12-14T09:10:38.297 回答
15

我建议大家不要使用它或仅使用顺势疗法剂量。不幸的是,由于遗留原因,我不得不经常使用它,正如之前所说,它是为 .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。

于 2011-03-10T15:28:44.120 回答
7

JScript .NET 是支持为 Sony 的媒体编辑产品系列编写应用程序扩展的语言之一。声音锻造和维加斯。

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

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

他们为 Sound Forge 的脚本编写者提供了一个网络论坛

于 2009-12-22T04:20:06.360 回答
5

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

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

它肯定不是该家族的成熟成员,从某种意义上说,它在功能方面似乎在 .NET 1.1 中有些落后,不存在工具支持,而且文档令人震惊。这就是为什么我如此喜欢它的部分原因,实际上,让我觉得我在编程。

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

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

于 2010-04-06T21:57:54.230 回答
4

嗯,我正在尝试使用它。我不能说我已经成功了。

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

我想将一些数据库表公开给网页,所以我拼凑了一个快速的经典 ASP(是的,是的,我知道)页面,该页面从 SQL Server 中提取数据并将表作为 JSON 对象返回。我没有为 VBScript 找到 JSON 序列化程序,而是在 J(ava)script 中编写了双方并在服务器上导入了 json2.js 以提供序列化。效果很好;老实说,它只花了不到一个小时就返回了一个漂亮的 JSON 表格表示,其中 50 分钟是让 JScriptjson2.min.js直接导入而不是在它周围扔<% %>包装器并重命名它的尝试,但徒劳无功json2.min.asp

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

我在这里遵循最佳实践,我会将所有内容都包装在一个类等中,但由于我只是试图走出车道,我尝试对现有代码进行快速移植,该代码从其他代码中导入各种有用的 Javascript使用 ASPinclude语句的文件。

包括一些简单的东西使用<--#incude file="somejsconstants.asp" -->效果很好,让我从那个文件中访问常量。但是我尝试使用 JSON 序列化程序<--#incude file="json2.min.asp" -->并没有成功,并启动了一个经过json2.js适当修改的版本以成为一个独立的 aspx 页面并引发了同样的错误。(编译器错误是Objects of type 'jscript_aspx' do not have such a member.) JScript.NET 似乎对闭包的使用不满意,闭包是当今 javascript 库中几乎无处不在的构造。

从上面的帖子很明显,有很多方法可以在 .NET 平台中序列化 JSON 对象,但我的直觉是,如果 JScript.NET 在 Douglas Crockford 编写的 Javascript 上出现问题,那么它就是一个古怪、不兼容的鼠洞,不值得投资我的时间。我不妨跟随 ASP.NET 大众并使用 C#。

于 2010-07-14T17:41:36.060 回答
4

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

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

于 2009-12-22T08:37:10.000 回答
3

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

在这里可以找到一些例子

于 2015-03-15T09:48:21.463 回答
2

我在这里聚会迟到了,但我想补充一下:

我看到 JScript.NET 对服务器端代码很有用。在服务器端使用与客户端使用基本相同的东西是很自然的。此外,它使使用 JSON 变得更加容易,因此如果您正在创建一个通过 JSON 进行通信的 Web 服务,这将是一个福音。

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

于 2010-02-11T23:03:09.877 回答
1

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

于 2009-12-18T22:16:46.623 回答
-1

JScript .NET 是一种具有多种应用程序的现代脚本语言。它是一种真正的面向对象语言,但仍保持其“脚本”的感觉。JScript .NET 保持与 JScript 早期版本的完全向后兼容性,同时结合了出色的新功能并提供对公共语言运行时和 .NET Framework(来自JScript.NET)的访问。

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

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

阅读JScript.NET 简介

我个人的想法是,对于习惯于使用纯 JScript 编写并希望在无需学习新语言的情况下获得 .NET 的好处的 Web 开发人员,或者对于那些想要将所有代码编写成的人来说,这可能会很糟糕一种语言。

于 2009-12-13T13:36:38.417 回答
-2

我只是假设 Microsoft 使用它来夸大 .NET 在发布时支持的语言数量,以用于营销目的。

于 2009-12-21T17:30:19.933 回答
-2

JScript.NET Wikipedia 页面非常易于解释:http ://en.wikipedia.org/wiki/JScript_.NET

简而言之,它似乎是带有 .NET 库的 JavaScript。

于 2009-12-13T13:36:33.297 回答