C# JSIL vs脚本#vs SharpKit

C# JSIL vs脚本#vs SharpKit,c#,javascript,.net,asp.net-mvc,C#,Javascript,.net,Asp.net Mvc,我正在将Script、JSIL和SharpKit作为一种工具来编译C到Javascript,这样我就可以在visualstudio中使用C编写AJAX的客户端函数 每个JSIL、脚本和SharpKit的优缺点是什么 我的项目是一个使用razor引擎和C#的MVC4项目,如果有必要的话。如果这有帮助,我很高兴 对于ScriptSharp,此stackoverflow链接可能会有所帮助。 如果您有任何SVN工具,请从下载一个示例,这是一个有效的源代码,可以帮助您走得更远。Script\pros:

我正在将Script、JSIL和SharpKit作为一种工具来编译C到Javascript,这样我就可以在visualstudio中使用C编写AJAX的客户端函数

每个JSIL、脚本和SharpKit的优缺点是什么


我的项目是一个使用razor引擎和C#的MVC4项目,如果有必要的话。

如果这有帮助,我很高兴

对于ScriptSharp,此stackoverflow链接可能会有所帮助。

如果您有任何SVN工具,请从下载一个示例,这是一个有效的源代码,可以帮助您走得更远。

Script\pros:

  • 免费的
  • 开源
  • 生成干净的JavaScript
脚本#缺点:

  • 仅支持C#2.0语言的子集
  • 只能在单独的项目中编译,不能在客户端和服务器之间混合/重复使用代码
  • 版本更新频率低
  • 不提供支持
  • 有限的第三方库支持,C#API不同于JavaScript API
  • 非开源
  • 仅在JavaScript中调试
SharpKit pros:

  • 商品
  • 支持完整的C#4.0语言
  • 高频率的版本更新
  • 支持可用
  • 客户机/服务器代码可以在同一个项目中混合使用
  • 广泛的第三方库支持,作为开源的C#API与JavaScript API完全匹配
  • 支持Chrome浏览器的基本C#调试
  • 生成干净的JavaScript
SharpKit缺点:

  • 有一个没有时间限制的免费版本,但仅限于小型/开源项目
  • 非开源(只有库是开源的)
JSIL专业人士:

  • 免费的
  • 开源
JSIL cons:

  • 从IL(中间语言)转换,而不是从C#,这意味着较低的抽象层,因为代码已经是低级的
  • 复杂生成的JavaScript代码-几乎像IL一样,难以阅读和调试
对反馈的答复:

Kevin:JSIL输出不错,它的生成只是为了实现完整的.NET行为,很像SharpKit的CLR模式。另一方面,SharpKit支持本机代码生成,在本机代码生成中,任何本机JavaScript代码都可以从C#生成,与手工编写的代码完全相同

SharpKit干净生成的JavaScript代码示例:

开发人员可以选择创建更复杂的代码生成并获得更多功能,比如支持编译时方法重载。指定时,SharpKit将生成重载方法的方法后缀


脚本需要.NET 4才能运行,但它不支持完整的C#4.0语法,如泛型、ref和out参数、命名空间别名等。

如果您希望直接与MVC项目集成,像Script#或SharpKit之类的东西可能是你最好的选择——我知道Script#内置了一些东西,使这种集成更容易,所以我从这里开始

如果您确实想尝试使用JSIL,它可能具有您需要的核心功能,但您可能需要的东西—如VisualStudio集成、自动部署等—并不存在。目前,它主要针对应用程序的交叉编译,因此它在这方面做得很好,但在其他用例方面做得不好

我将试图总结一下你为什么要考虑JSIL的其他选择——我不能真正地评论这些替代品的利弊,因为我没有使用它们:


JSIL对C#4中可用的特性有着极其广泛的支持。值得注意的(或者是因为其他工具不支持它们,或者它们很复杂)包括:

、和

当然,上面的一些文件并没有完全的支持——为了了解绝对有效的东西,您可以——每个文件都是一个小型的自包含的.cs文件,经过测试以确保JSIL和本机C#产生相同的输出

之所以提供这种广泛支持,是因为我的目标是让JSIL使您能够将完全未经修改的C#应用程序转换为工作的JS。对于JSIL站点上的所有演示,这是真的,我有几个接近完成的大型真实游戏的端口,这也是真的


另一个原因是JSIL使C#和JavaScript的对话变得相对简单

所有的C#类型和方法都通过一个尽可能友好的javascript界面公开。JS版本具有基本的重载解析和分派功能,因此本地C#接口可以从脚本代码中调用,就好像在大多数情况下它们是本地JS一样。除非您愿意,否则您不必采取任何步骤来专门标记您希望向JS公开的方法,或给它们指定特殊名称,或诸如此类的东西

当您想从C#呼叫到JS时,可以通过以下几种方式:

  • 允许您将原始javascript直接插入到函数的翻译版本中
  • 可以与dynamicvar相结合,直接在C#函数体中编写类似JavaScript的代码
  • 可以使用参数化JavaScript表达式替换C#函数的调用
  • 上述所有特性都可以与JSIL的更改类型信息的机制(称为代理)相结合,以允许您更改所使用库的类型信息,即使您没有源代码,以便将它们的方法映射到您编写的JavaScript
  • 最后,未转换为JS的C#方法会生成一个名为External的空方法,然后在运行时用JavaScript替换该方法,使其再次工作。您尚未替换的任何外部方法都会在运行时生成清晰的警告消息,以便您知道缺少了什么

JSIL积极使用类型信息以及您提供的元数据