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

pro*_*eek 17 mono

本页介绍了四种不同的单声道编译器--mcs/gmcs/smcs/dmcs.

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

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

Mik*_*son 20

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

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

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

  • 似乎最终使用IKVM.Reflection进行了重写.单声道2.10不再有这个问题. (8认同)

Rob*_*ner 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运行时.

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

  • 最新版本称为mcs.它是通用的,可以为任何目标框架进行编译. (7认同)