我正在将Script#,JSIL和SharpKit视为用于将C#编译为Javascript的工具,因此我可以在Visual Studio中使用C#编写AJAX的客户端功能。
每个JSIL,Script#和SharpKit的优缺点是什么?
我的项目是使用剃须刀引擎和C#的MVC4项目,如果重要的话。
答案 0 :(得分:21)
如果您希望直接与MVC项目集成,那么像Script#或SharpKit之类的东西可能是您最好的选择 - 我知道Script#内置了一些内容来实现这种集成更容易,所以我会从那里开始。
如果您确实想尝试使用JSIL,它可能具有您需要的核心功能,但您可能需要的东西 - 如可视化工作室集成,自动部署等 - 并不存在。目前它主要针对应用程序的交叉编译,所以它做得很好,但不如其他用例好。
我将尝试总结一下您可能想要考虑JSIL而非其他替代方案的原因 - 我无法对这些替代方案的优缺点进行真正的评论,因为我没有&#39 ;使用它们:
JSIL对C#4中提供的功能提供了极大的支持。值得注意的是(因为其他工具不支持它们,或者它们很复杂)包括:
dynamic,yield,Structs,ref / out,Delegates,Generics,Nullables,Interfaces ,和Enums。
上面的一些内容当然没有完整的支持 - 为了了解绝对可行的事情,你可以look at the test cases - 每个人都是经过测试以确保JSIL和本机C#产生相同输出的小型自包含.cs文件。
这种广泛支持的原因是我的目标是让JSIL能够将完全未修改的 C#应用程序转换为工作JS。对于JSIL网站上的所有演示,这是真的,我有几个近乎完成的大型真实游戏的端口,这也是如此。
另一个原因是JSIL让你的C#和你的JavaScript相对简单。
所有C#类型和方法都通过尽可能友好的javascript接口公开。 JS版本具有基本的重载解析和分派,因此本机C#接口可以从脚本代码中调用,就像在大多数情况下它们是本机JS一样。除非您愿意,否则您不必采取任何步骤专门标记您希望向JS公开的方法,或者给它们指定特殊名称或类似名称。
当你想从C#调用JS时,可以通过以下几种方式实现:
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。
好的,现在有一些缺点。不要将此列表详尽无遗:
希望这些信息有用!谢谢你的兴趣。
答案 1 :(得分:12)
脚本#sros:
脚本#cons:
SharpKit专业人士:
SharpKit缺点:
JSIL专业人士:
JSIL缺点:
反馈答案:
Kevin:JSIL输出不是坏,它只是为了实现完整的.NET行为而生成,就像SharpKit的CLR模式一样。另一方面,SharpKit支持 native 代码生成,其中任何本机JavaScript代码都可以从C#生成,就像它手工编写的那样。
SharpKit干净生成的JavaScript代码示例: http://sharpkit.net/Wiki/Using_SharpKit.wiki
开发人员可以选择创建更复杂的代码生成并获得更多功能,例如支持编译时方法重载。指定时,SharpKit会为重载方法生成方法后缀。
脚本#需要.NET 4才能运行,但它不支持完整的C#4.0语法,如Generics,ref和out参数,名称空间别名等......
答案 2 :(得分:8)
另一种选择是WootzJs。完全披露,我是它的作者。
WootzJs是开源的,并且努力成为一个相当轻量级的交叉编译器,它允许所有主要的C#语言功能。
支持的显着语言功能:
yield
语句(作为高效状态机生成)async/await
方法(生成为像C#编译器一样的状态机)ref
和out
参数this
)T
将抛出强制转换异常)它是使用Roslyn实现的,这意味着它将首先采用
未来语言改进的优势,因为现在将通过Roslyn本身实现。它提供了mscorlib
的自定义版本,因此您可以准确了解脚本中实际可用的库功能。
它的缺点是什么?
System.String
的所有方法都会添加到原生Javascript String
类型中。与其他交叉编译器的比较:
脚本#非常稳定,并且与第三方Javascript库进行了广泛的集成。此外,它具有出色的Visual Studio集成,并提供mscorlib
的自定义实现。这意味着您确切地知道在工具级别实际实现了哪些功能。例如,如果未实现Console.Write()
,则该方法将无法在您的编辑器中使用。
但是,由于它的自定义解析器,它仍然停留在C#2.0中(甚至没有在该版本的C#中找到的泛型)。这意味着现代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]
属性装饰每个脚本文件,以区别于正常编译类。
答案 3 :(得分:5)
我们有两年SharpKit,我必须说我们编写代码的方式已经升级。 我看到他们的专业人士:
缺点:
答案 4 :(得分:2)
很高兴,如果这可以帮助!
对于ScriptSharp,此stackoverflow链接可能有所帮助 What advantages can ScriptSharp bring to my tool kit?
如果您有任何SVN工具,请从https://github.com/kevingadd/JSIL下载示例,这是一个有效的源代码,可以帮助您走几英里。