我知道.NET和Mono是二进制兼容的,但是给定一组源代码,csc和mcs会产生完全相同的100%相同的二进制CLI可执行文件吗?是否可以判断可执行文件是使用csc还是mcs编译的?
答案 0 :(得分:4)
很多事情没有在规范中完全定义,或者是特定于实现的扩展。
未完全指定的示例:
Expression
建筑(来自lambdas);简单地“在其他地方定义”(实际上,它不是)实施扩展的示例:
new
)所以不是:不能保证在csc或[g] mcs之间具有相同的IL,但即使在不同版本的csc之间也是如此。
更多:根据调试设置,启用或不启用优化,以及定义某些编译常量(例如DEBUG或TRACE),相同的编译器将生成不同的代码。
答案 1 :(得分:1)
我确定他们不会从相同的源代码生成相同的IL。即使不同版本的MS C#编译器也没有。
优化器的工作方式不同,并且会创建略有不同的代码。
我期望在复杂功能的实现方面存在较大差异,例如迭代器,为lamdas捕获的局部变量,......
然后有任意编译器生成的名称,例如匿名类型。他们没有理由为他们使用相同的命名方案。
如果有一些包含编译器名称和版本的程序集元数据,我也不会感到惊讶。