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

Mono 为什么有四个单声道C#编译器?,mono,Mono,解释四种不同的单声道编译器-mcs/gmcs/smcs/dmcs 对我来说,有四个C#编译器有点奇怪。通常情况下,较新版本的编译器保持向后兼容性 我认为这是因为运行时支持问题,但是微软的C#有一个csc.exe支持所有的运行时版本 出于同样的原因,您仍然可以使用Visual Studio 2005在.NET 2.0中进行开发。当然,您可以使用VS2010并启动一个仅使用.NET2.0代码的.NET4.0项目,但是一些公司害怕升级框架/编译器版本,如果它们已经有了正常工作的东西 仅仅因为新的编译器

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

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


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

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

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

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

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

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

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

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


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

似乎最终完成了使用IKVM.Reflection的重写。Mono 2.10不再有此问题。最新版本称为mcs。它是通用的,可以为任何目标框架编译。