Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 使用vs2008编译的源代码生成的二进制文件与csc在命令行直接编译的同一源代码不同_Visual Studio 2008_Msbuild_Csc - Fatal编程技术网

Visual studio 2008 使用vs2008编译的源代码生成的二进制文件与csc在命令行直接编译的同一源代码不同

Visual studio 2008 使用vs2008编译的源代码生成的二进制文件与csc在命令行直接编译的同一源代码不同,visual-studio-2008,msbuild,csc,Visual Studio 2008,Msbuild,Csc,我不明白为什么如果我使用Visual Studio 2008(MSBuild)编译相同的源代码,然后在命令行中使用csc(或NANT),我就无法获得相同的二进制文件(相同的程序集) 命令行与VisualStudio调用的命令行相同,因为我从输出窗口复制命令,然后将命令粘贴到vs2008命令提示符 我知道,如果我在不同的时间编译同一个源代码,由于程序集元数据中的时间戳,我会获得不同的二进制文件。事实上,如果我比较vs2008在不同时间生成的两个二进制文件,我会注意到二进制数据之间的微小差异 但是如

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

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

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

但是如果我用vs编译,然后用csc编译,二进制文件会非常不同!
你知道为什么吗?出什么问题了?

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

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

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


尝试使用显式的
/debug
/o
开关(设置为您想要的方式)构建并在Visual Studio中匹配它们。如果在Visual Studio生成配置中定义了调试和/或跟踪符号,也要定义它们。

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


尝试使用显式的
/debug
/o
开关(设置为您想要的方式)构建并在Visual Studio中匹配它们。如果在VisualStudio构建配置中定义了调试和/或跟踪符号,也要定义它们。

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

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


你有没有参考过一份解释这两种方法的文件?

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

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


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

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

不保证编译器对元数据的任何特定顺序做出保证。也就是说,没有什么故意导致in-proc编译器和csc.exe之间的顺序不同。

它们有什么不同?如果使用ildasm.exe(从Visual Studio命令提示符)反汇编程序集会怎么样?您可以保存转储文件并对其进行区分。它们有什么不同?如果使用ildasm.exe(从Visual Studio命令提示符)反汇编程序集会怎么样?您可以保存a转储并对其进行区分。@斯科特:时间戳问题解释了为什么在不同时间生成两个二进制文件会产生略微不同的二进制文件,但不是为什么从命令行生成的二进制文件与VS生成的二进制文件大不相同。@斯科特:时间戳问题解释了为什么在不同时间生成两个二进制文件会产生略微不同的结果不同的二进制文件-但这并不是为什么从命令行构建的二进制文件与VS的二进制文件非常不同。