我无法理解为什么如果我使用Visual Studio 2008(MSBuild)编译相同的源,然后在命令行使用csc(或NANT),我无法获得相同的二进制文件(同一个集会)。
命令行与visual studio相同,因为我从输出窗口复制命令,然后将命令粘贴到vs2008命令提示符。
我知道如果我在不同的时间编译相同的源,我会因为程序集元数据中的时间戳而获得不同的二进制文件。事实上,如果我在不同时间比较vs2008生成的两个二进制文件,我会注意到二进制数据之间的差别很小。
但是如果我使用vs编译然后使用csc编译二进制文件是非常不同的! 你知道为什么吗?怎么了?
答案 0 :(得分:1)
无法保证编译器所做的任何特定元数据顺序。也就是说,没有任何故意导致进程内编译器和csc.exe之间的顺序不同。
答案 1 :(得分:0)
一个非常大胆的猜测,但是VS IDE和终端中的环境变量可能不一样。在更糟糕的情况下,您的终端版本可能与另一个.NET框架或至少与其他几个库/代码文件或编译器交换机相关联?
答案 2 :(得分:0)
您还没有说过是否在Visual Studio中构建调试版或二进制版。我不确定命令行默认值是否与 相同。
尝试使用显式/debug
和/o
开关构建(无论如何设置),并在Visual Studio中进行匹配。如果在Visual Studio构建配置中定义了DEBUG和/或TRACE符号,也可以定义它们。
答案 3 :(得分:0)
@ Marc Gravell,Divo,Jon:我试图用ILDASM来反汇编这两个声明。经过深入分析和比较后,我发现IL内容非常相似,但所有类和方法,属性getter和setter等在程序集中的顺序完全不同!因此,如果我将两个程序集与十六进制编辑器/比较器进行比较,我会看到一个完全不同的二进制体!
现在我需要理解为什么VS和Csc以这种不同的方式与编译器交互!
您是否有对解释这两个方法的文档的引用?