c# - JSIL与Script#与SharpKit

标签 c# javascript .net asp.net-mvc

我正在寻找Script#,JSIL和SharpKit作为用于将C#编译为Javascript的工具,因此我可以在Visual Studio中使用C#对AJAX的客户端功能进行编程。

每个JSIL,Script#和SharpKit的优缺点是什么?

我的项目是使用 Razor 引擎和C#的MVC4项目(如果有关系的话)。

最佳答案

如果您希望直接与MVC项目集成,那么Script#或SharpKit之类的东西可能是您最好的选择-我知道Script#内置了一些东西可以简化这种集成,因此我会从那里开始。

如果您确实想尝试使用JSIL,它可能具有所需的核心功能,但是您可能不需要的东西(如Visual Studio集成,自动部署等)就不存在。目前,它主要针对应用程序的交叉编译,因此它做得很好,但在其他用例中却做得不好。

我将尝试总结为什么您可能想在其他替代方案中考虑使用JSIL的原因-由于我没有使用过这些替代方案,因此我无法真正深入地评论这些替代方案的优缺点:

JSIL对C#4中可用的功能提供了广泛的支持。值得注意的(包括因为其他工具不支持它们,或者它们很复杂)包括:

dynamicyieldStructsref / outDelegatesGenericsNullablesInterfacesEnums

当然,上面的某些功能没有完全的支持-要想知道绝对可行的功能,可以look at the test cases-每个都是一个小的自包含.cs文件,该文件经过测试以确保JSIL和本地C#产生相同的输出。

获得广泛支持的原因是,我的目标是使JSIL使您能够将完全未经修改的C#应用​​程序转换为可工作的JS。对于JSIL网站上的所有演示,都是如此,我在机翼上有一些即将完成的大型真实游戏移植,这也是事实。

另一个原因是,JSIL使您的C#和JavaScript交谈相对简单。

您所有的C#类型和方法都通过尽可能与JavaScript友好的接口(interface)公开。 JS版本具有基本的重载解析和分派(dispatch)功能,因此在大多数情况下,可以从脚本代码中调用本地C#接口(interface),就像它们是本地JS一样。除非您愿意,否则您无需采取任何步骤来专门标记要公开给JS的方法,也不必为其指定特殊名称或类似名称。

当您想从C#调用JS时,可以采用以下几种方法:

  • JSIL.Verbatim.Expression允许您将原始javascript直接插入函数的翻译版本中。
  • JSIL.Builtins.Global可以与动态 var 结合使用,以直接在C#函数体中编写类似JavaScript的代码。
  • The JSReplacement attribute可用于将C#函数的调用替换为参数化的JavaScript表达式。
  • 以上所有功能都可以与JSIL的用于更改类型信息的机制(称为代理)结合使用,以允许您更改所使用的库的类型信息(即使您没有源代码)也可以将其方法映射到您编写的JavaScript。
  • 最后,未转换为JS的C#方法会生成一个名为External的空方法,您可以在运行时将其替换为JavaScript以使其再次运行。您没有替换的任何外部方法都会在运行时产生清晰的警告消息,因此您知道缺少什么。


  • JSIL积极使用类型信息以及您提供的元数据来尝试并安全地优化为您生成的JavaScript。在某些情况下,它可以产生比您手工编写的更好的等效JavaScript-当前适用的主要方面是使用结构的代码,但在其他情况下也可以使用。

    例如,in this code snippet,JSIL能够静态确定,尽管代码隐含了许多结构副本,但实际上并不需要任何副本来使代码正确运行。 The resulting JavaScript最终没有任何不必要的副本,因此它的运行速度比如果您天真地转换原始C#的语义所得到的副本要快得多。这是编写基于天真的基于结构的东西(到处都是Vector2s)和使用completely nuts with named return value optimization by hand(即as I've described in the past, is pretty error-prone)之间的一个很好的中间立场。

    好吧,现在有一些缺点。不要认为此列表是详尽无遗的:
  • .NET BCL的大部分没有JSIL为您提供的实现。将来可能会通过将整个Mono mscorlib转换为JavaScript来解决,但是我还没有很好的工作来提倡将其作为一种立即解决方案。 (到目前为止,这对于游戏来说是很好的,因为它们没有使用太多的BCL。)此问题主要是由于与翻译Microsoft的mscorlib有关的IP问题-如果我可以合法地做到这一点,那我做对了现在-我上次测试它时有效。
  • 如上所述,没有Visual Studio集成。 JSIL非常易于使用-您可以向其提供.sln文件,以自动获取一堆.js输出,并使用项目旁边的配置文件自动对其进行配置-但它远不如脚本完善或集成#
  • 没有供应商或支持人员。如果您想昨天解决一个错误或遇到问题,那么我目前只是您的唯一选择(尽管有一些多产的贡献者正在帮助改善事情,并且随时欢迎更多人参与!)
  • JavaScript的性能令人难以置信,充满了无形的地雷。如果您只是想让应用程序正常运行,那么这里可能不会有任何问题,但是如果像我一样,您正在尝试使真实的游戏在JavaScript will make your life hell and in some cases JSIL will make it worse浏览器中快速运行。我在这里唯一能说的就是我正在努力。 :)
  • 明确不支持JavaScript压缩器和优化器(例如Closure),因为它们需要您的代码生成器来跳过一堆箍。我可以看到这是一个真正的阻止者,具体取决于您打算如何使用代码。
  • 静态分析器仍然很脆弱,并且在语言支持方面仍然存在差距。我使用JSIL移植的每个大型应用程序通常都会揭示JSIL中的一两个错误-不是很大的游戏破坏程序,而是肯定会破坏功能或使事情运行缓慢的错误。

  • 希望此信息对您有所帮助!感谢您的关注。

    关于c# - JSIL与Script#与SharpKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11547471/

    相关文章:

    javascript - 在 Javascript 中提醒用户更新已成功

    javascript - 当参数来自不同地方时如何调用函数

    c# - 通过遍历数组创建 KeyValuePair 列表

    c# - 如何在不使用数组的情况下仅拆分一个字符串

    c# - 添加与 Visual Studio 2010 的连接

    C# TLS 和 SQL Server

    javascript - 在 Electron 中从网站上刮掉html标签

    c# - 针对旧版 .NET 框架编译单独的 C# 文件

    c# - 如何解析非结构化的 csv 文件

    c# - 如何使用 autofac 注册类型化的 httpClient 服务?