我很想知道谁使用 JScript.Net 以及用于什么样的应用程序。每当我阅读 MSDN .Net 文档时,我总是会注意到 JScript 示例,但多年来我一直是 C# 开发人员,但我从未真正知道有人使用它。
人们将它用于什么类型的应用程序,以及它如何衡量 C# 的灵活性、功能和一般用途?
[编辑:澄清一下——我不是在问 JScript.Net是什么,我是在问人们实际使用它的目的——即有兴趣了解实际使用场景以及人们如何发现它可以使用]
我很想知道谁使用 JScript.Net 以及用于什么样的应用程序。每当我阅读 MSDN .Net 文档时,我总是会注意到 JScript 示例,但多年来我一直是 C# 开发人员,但我从未真正知道有人使用它。
人们将它用于什么类型的应用程序,以及它如何衡量 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 有一个窗口,您可以使用它来编辑和运行脚本来操作音频文件。
事实证明,Microsoft 使用一种(或所有).NET 支持的语言为您的应用程序添加脚本非常容易。VB、JScript 和 C#。只需从您的应用程序中公开一些对象并将这些对象(实际上是程序集)连同用户的脚本文本一起交给编译器。
我经常使用它,几乎完全用于 ASP.NET 和相关的 web-stuff。
您可以将它用于几乎所有可以使用其他 .NET 语言的东西。它使 MSIL,就像其他人一样 ;) 使用“快速”选项编译,该选项会转换一些本机 javascript 特征,如原型扩展和 eval,它的执行就像 CLR 上的任何其他代码一样。
它肯定不是该家族的成熟成员,从某种意义上说,它在功能方面似乎在 .NET 1.1 中有些落后,不存在工具支持,而且文档令人震惊。这就是为什么我如此喜欢它的部分原因,实际上,让我觉得我在编程。
如果您有很多 (j) 脚本需要转换为 .NET,那么这是显而易见的选择,因为您通常只需要很少的重写即可使其工作。否则,选择 JScript.NET 而不是任何其他 .NET 语言并没有什么特别的理由,而且有很多理由不这样做。
这一切都归结为个人喜好,因为无论语言如何,最终都会成为相同的 CLR 代码。我发现 JScript.NET 随和、自然编写并且具有与我尝试过的其他语言不同的灵活简单性,所以我一直使用它,直到遇到该语言无法处理的问题。还没有发生。
嗯,我正在尝试使用它。我不能说我已经成功了。
我在任何环境中都没有做过很多网络编码,但这是我的 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#。
借助业务流程管理工具Metastorm BPM,您可以使用 JScript.Net 来扩展您的工作流程。例如,您可以将自定义 .Net .dll 添加到引擎并使用 JScript.Net 在您的流程中与它们交互。
我的经历是非常积极的。我只实现了一些小的粘合脚本,但我更喜欢随时使用 JScript.Net 编写脚本而不是 VBScript(第二种支持的脚本语言)。
作为批处理文件和控制台应用程序的增强,由于它的指令,它允许整洁的混合(没有不必要的输出)。保存以下带有.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");
在这里可以找到一些例子。
我在这里聚会迟到了,但我想补充一下:
我看到 JScript.NET 对服务器端代码很有用。在服务器端使用与客户端使用基本相同的东西是很自然的。此外,它使使用 JSON 变得更加容易,因此如果您正在创建一个通过 JSON 进行通信的 Web 服务,这将是一个福音。
我编写了一个使用 C# 工作的 Web 服务,但由于这些原因,我正在考虑迁移到 JScript.NET。
我不知道它在性能方面如何比较,但我知道 JScript.NET 是您可以与Unity 3D一起使用的语言之一。
JScript .NET 是一种具有多种应用程序的现代脚本语言。它是一种真正的面向对象语言,但仍保持其“脚本”的感觉。JScript .NET 保持与 JScript 早期版本的完全向后兼容性,同时结合了出色的新功能并提供对公共语言运行时和 .NET Framework(来自JScript.NET)的访问。
此外,您可能会发现这篇 stackoverflow 帖子也很有帮助: Can JScript.NET be used to script a .NET application?
至于谁在使用,老实说我不知道(我很确定那里有)。
我个人的想法是,对于习惯于使用纯 JScript 编写并希望在无需学习新语言的情况下获得 .NET 的好处的 Web 开发人员,或者对于那些想要将所有代码编写成的人来说,这可能会很糟糕一种语言。
我只是假设 Microsoft 使用它来夸大 .NET 在发布时支持的语言数量,以用于营销目的。
JScript.NET Wikipedia 页面非常易于解释:http ://en.wikipedia.org/wiki/JScript_.NET
简而言之,它似乎是带有 .NET 库的 JavaScript。