我知道.NET和Mono是二进制兼容的,但是给出了一组源代码,csc和mcs会产生完全相同的100%完全相同的二进制CLI可执行文件吗?你能分辨出一个可执行文件是用csc还是mcs编译的?
发布于 2011-05-02 02:49:43
很多东西在规范中没有完全定义,或者是特定于实现的扩展。
未完全指定的示例:
(从lambda);简单地“定义在别处”(实际上,它不是)
实现扩展的示例:
new )因此,不能保证在csc或gmcs之间有相同的IL -甚至在csc的不同版本之间也是如此。
更重要的是:根据调试设置、优化是否启用以及定义的某些编译常量(例如debug或TRACE),相同的编译器将生成不同的代码。
发布于 2011-05-02 01:42:01
我确信它们不会从相同的源码产生相同的IL。即使是不同版本的MS C#编译器也不支持。
优化器将以不同的方式工作,并创建略有不同的代码。
我预计复杂功能的实现会有更大的差异,比如迭代器,为lamdas捕获的局部变量,...
然后是任意编译器生成的名称,例如匿名类型。没有理由让它们使用相同的命名方案。
如果也有一些程序集元数据包含编译器的名称和版本,我也不会感到惊讶。
https://stackoverflow.com/questions/5850142
复制相似问题