.NET csc和Mono mcs的兼容性

时间:2011-05-01 17:40:27

标签: .net mono command-line-interface

我知道.NET和Mono是二进制兼容的,但是给定一组源代码,csc和mcs会产生完全相同的100%相同的二进制CLI可执行文件吗?是否可以判断可执行文件是使用csc还是mcs编译的?

2 个答案:

答案 0 :(得分:4)

很多事情没有在规范中完全定义,或者是特定于实现的扩展。

未完全指定的示例:

  • 字段事件的同步语义;这是 明确 对ecma规范中的实现开放;它在MS规范中定义严格,但在c#4.0中使用了不同的版本,其中 尚未 出现在正式规范中,IIRC
  • Expression建筑(来自lambdas);简单地“在其他地方定义”(实际上,它不是)

实施扩展的示例:

  • P /调用
  • COM接口处理(即如何在接口上调用new

所以不是:不能保证在csc或[g] mcs之间具有相同的IL,但即使在不同版本的csc之间也是如此。

更多:根据调试设置,启用或不启用优化,以及定义某些编译常量(例如DEBUG或TRACE),相同的编译器将生成不同的代码。

答案 1 :(得分:1)

我确定他们不会从相同的源代码生成相同的IL。即使不同版本的MS C#编译器也没有。

优化器的工作方式不同,并且会创建略有不同的代码。

我期望在复杂功能的实现方面存在较大差异,例如迭代器,为lamdas捕获的局部变量,......

然后有任意编译器生成的名称,例如匿名类型。他们没有理由为他们使用相同的命名方案。

如果有一些包含编译器名称和版本的程序集元数据,我也不会感到惊讶。