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

问题描述:

This page解释了四种不同的单声道编译器-mcs/gmcs/smcs/dmcs。为什么会有四个单声道C#编译器?

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

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

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

已经有计划了,而有* MCS请使用Mono.Cecil能或Ikvm.Reflection,而不是系统。反射,这意味着可能会有一个单一的mcs编译器,其中有一些参数用于定位不同的运行时。

微软的编译器没有这个限制,因为它没有使用.NET Reflection(它是用本地代码编写的)。

+8

看来,重写使用IKVM.Reflection终于发生了。单声道2.10不再有这个问题。 – Justin 2011-03-04 06:29:40

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

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

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

  • MCS:编译器目标1.1运行时(与单声道2.8被弃用)。
  • gmcs:编译器以2.0运行时为目标。
  • smcs:编译器以2.1运行时为目标,构建Moonlight应用程序。
  • dmcs:从Mono 2.6开始,此命令是C#4.0编译器,并引用了4.0运行时。

就个人而言,我喜欢升级时,我可以,但有些公司和团队都不能出于某种原因或其他这样做。

+6

最新版本被称为mcs。它是通用的,可以编译任何目标框架。 – 2015-03-18 03:51:00