为什么有四个单声道C#编译器?

时间:2010-10-07 14:21:29

标签: mono

This page解释了四种不同的单声道编译器 - mcs / gmcs / smcs / dmcs。

对我来说,拥有四个C#编译器有点奇怪。通常,较新版本的编译器保持向后兼容性。

我认为这是因为运行时支持问题,但Microsoft的C#有一个支持所有运行时版本的csc.exe。

2 个答案:

答案 0 :(得分:19)

这是因为Mono的编译器是用C#编写的,并且使用System.Reflection,这意味着它只能从运行它的运行时访问mscorlib。因此,例如,smcs不只是针对2.1,它实际上使用 2.1 corlib等。

有一段时间计划让* mcs使用Mono.Cecil或Ikvm.Reflection而不是System.Reflection,这意味着可能会有一个带有参数的mcs编译器来定位不同的运行时。

Microsoft的编译器没有此限制,因为它不使用.NET Reflection(它是用本机代码编写的)。

答案 1 :(得分:13)

出于同样的原因,您仍然可以使用Visual Studio 2005在.NET 2.0中进行开发。当然,您可以使用VS2010并仅使用.NET 2.0代码启动.NET 4.0项目,但有些公司害怕升级框架/编译器版本,如果他们已经有一些正常工作。

仅仅因为新的编译器版本向后兼容并不意味着团队想要升级。

拥有不同的编译器版本可确保Mono的所有用户仍然可以使用他们选择的任何编译器版本并且感觉很舒服。

  
      
  • mcs:编译器以1.1运行时为目标(不推荐使用Mono 2.8)。
  •   
  • gmcs:用于定位2.0运行时的编译器。
  •   
  • smcs:编译器以2.1运行时为目标,构建Moonlight应用程序。
  •   
  • dmcs:从Mono 2.6开始,此命令是C#4.0编译器,并引用4.0运行时。
  •   

就个人而言,我喜欢随时升级,但有些公司和团队由于某种原因无法这样做。