1

我不明白为什么如果我使用 Visual Studio 2008 (MSBuild) 编译相同的源代码,然后在命令行中使用 csc (或 NANT),我无法获得完全相同的二进制文件(相同的程序集)。

命令行与 Visual Studio 调用的命令行相同,因为我从输出窗口复制命令,然后将命令粘贴到 vs2008 命令提示符。

我知道,如果我在不同时间编译相同的源代码,我会因为程序集元数据中的时间戳而获得不同的二进制文件。事实上,如果我比较 vs2008 在不同时间生成的两个二进制文件,我会注意到二进制数据之间的细微差别。

但是,如果我先用 vs 编译,然后再用 csc 编译,那么二进制文件就大不相同了!你知道为什么吗?怎么了?

4

4 回答 4

1

不保证编译器生成的元数据的任何特定顺序。也就是说,没有任何东西故意导致进程内编译器和 csc.exe 之间的顺序不同。

于 2009-06-27T19:47:07.410 回答
0

一个非常大胆的猜测,但可能VS IDE和你的终端中的环境变量不一样。在更糟糕的情况下,您的终端版本可能链接到另一个 .NET 框架,或者至少链接到几个其他库/代码文件或编译器开关?

于 2009-06-13T17:55:16.943 回答
0

您还没有说您是在 Visual Studio 中构建调试版本还是二进制版本。我不确定命令行默认值是否与它们中的任何一个相同。

尝试使用显式/debug/o开关(设置为你想要的)并在 Visual Studio 中匹配它们。如果您在 Visual Studio 构建配置中定义了 DEBUG 和/或 TRACE 符号,则还要定义它们。

于 2009-06-13T22:42:48.687 回答
0

@Marc Gravell,Divo,Jon:我尝试使用 ILDASM 拆解这两个组件。经过深入分析和比较,我发现IL的内容完全一样,但是所有的类和方法,属性getter和setter等在程序集中的顺序非常不同!因此,如果我将两个程序集与十六进制编辑器/比较器进行比较,我会看到一个完全不同的二进制体!

现在我需要了解为什么 VS 和 Csc 以这种不同的方式与编译器交互!

您是否参考了解释这两种方法的文档?

于 2009-06-14T16:41:25.660 回答