我正在考虑使用Script#、JSIL和SharpKit作为将C#编译为Javascript的工具,这样我就可以在Visual Studio中使用C#编写AJAX的客户端功能。
JSIL、Script#和SharpKit各有优缺点,请问它们分别是什么?
我的项目使用Razor引擎和C#,是一个MVC4项目。
我正在考虑使用Script#、JSIL和SharpKit作为将C#编译为Javascript的工具,这样我就可以在Visual Studio中使用C#编写AJAX的客户端功能。
JSIL、Script#和SharpKit各有优缺点,请问它们分别是什么?
我的项目使用Razor引擎和C#,是一个MVC4项目。
JSIL对C# 4中可用的功能支持非常广泛。其中一些值得注意的功能(要么是因为其他工具不支持它们,要么是因为它们很复杂)包括:
动态, yield, 结构体, ref / out, 委托, 泛型, 可空类型, 接口, 和 枚举。
当然,上述内容中有些并没有完整的支持。如果想要了解绝对能够工作的内容,您可以查看测试用例。每个测试用例都是一个小的、自包含的 .cs 文件,通过测试确保 JSIL 和本机 C# 产生相同的输出。
提供如此广泛的支持是因为我的目标是让 JSIL 能够将一个完全未修改的 C# 应用程序转换为可用的 JS。对于 JSIL 网站上的所有演示,这是真实的,并且我还有一些几乎完成的大型真实游戏移植项目,也符合这一点。
好的,现在让我们来谈谈一些缺点。请注意,这个列表不是详尽无遗的:
Script# 优点:
Script# 缺点:
SharpKit 优点:
SharpKit 缺点:
JSIL 优点:
JSIL 缺点:
反馈答案:
Kevin:JSIL 的输出并不糟糕,它只是为了实现完整的 .NET 行为而生成的,就像 SharpKit 的 CLR 模式一样。另一方面,SharpKit 支持本地代码生成,可以从 C# 生成任何本地 JavaScript 代码,就像手写一样。
SharpKit的干净生成的JavaScript代码示例:
http://sharpkit.net/Wiki/Using_SharpKit.wiki开发人员可以选择创建更复杂的代码生成并获得更多功能,例如支持编译时方法重载。当指定时,SharpKit会为重载的方法生成方法后缀。
Script#需要.NET 4才能运行,但它不支持完整的C# 4.0语法,例如泛型、ref和out参数、命名空间别名等。
mscorlib
,所以您可以确切地知道在脚本中实际可用的库功能。System.String
的方法都添加到本机Javascript String
类型中。
- 目前很少支持绑定到第三方Javascript库。(目前仅支持jQuery)Script#非常稳定,并且与第三方JavaScript库有广泛的集成。此外,它具有出色的Visual Studio集成,并提供mscorlib
的自定义实现。这意味着您可以精确地知道在工具级别上实际实现了哪些功能。例如,如果未实现Console.Write()
,则该方法将不可用于您的编辑器。
但是,由于其自定义解析器,它仍然停留在C# 2.0(甚至没有该版本中找到的泛型)。这意味着现代C#开发人员正在放弃一个我们大多数人毫不犹豫地依赖的巨大的语言功能集,特别是前面提到的泛型以及lambda和LINQ。这使得Script#对许多开发人员来说基本上是无法启动的。
JSIL是一项非常令人印象深刻的工作,可以将IL交叉编译为JavaScript。它非常强大,可以轻松处理跨平台的大型3D视频游戏的交叉编译。缺点是,由于其完整性,生成的JavaScript文件非常庞大。如果只想要mscorlib.dll和System.dll,则需要下载约50MB。此外,该项目实际上并不是为在Web应用程序的上下文中使用而设计的,因此启动所需的工作量有点令人生畏。
这个工具包也实现了自定义mscorlib
,再次允许您知道可用的功能。但是,它的Visual Studio集成较差,强制您创建所有必要的自定义构建步骤来调用编译器并将输出复制到所需的位置。
SharpKit:这个商业产品致力于提供对大多数C# 4.0语言功能的支持。它通常能够成功,并且有很大的机会满足您的需求。它体积小(小型.JS文件),支持现代C#语言功能(泛型、LINQ等),通常可靠。它还有大量绑定第三方JavaScript库的功能。但是,您不可避免地会遇到一些不受支持的边缘情况。
例如,类型系统是浅层的,不支持表示泛型或数组(即typeof(Foo[]) == typeof(Bar[])
,typeof(List<string>) == typeof(List<int>)
)。反射的支持有限,各种成员类型无法支持属性。表达式树支持不存在,并且yield实现效率低下(无状态机)。此外,没有自定义mscorlib
,并且脚本C#文件和普通C#文件在项目中交织在一起,因此您必须使用[JsType]
属性装饰每个脚本文件以将其与正常编译的类区分开来。
缺点:
希望这能有所帮助!
对于ScriptSharp,这个stackoverflow链接可能会有所帮助。
ScriptSharp能为我的工具箱带来哪些优势?
如果您有任何SVN工具,请从https://github.com/kevingadd/JSIL下载样例代码,这是一个可用的源代码,可以帮助您走得更远。