2009-06-13 78 views
1

我不明白爲什麼如果我編譯相同的源代碼使用Visual Studio 2008(MSBuild),然後使用csc (或NANT)在命令行我無法獲得相同的二進制文件(相同的程序集)。使用vs2008編譯的源代碼產生的二進制文件不同於源代碼在csc中直接編譯的源代碼

命令行與visual studio調用的命令行相同,因爲我從輸出窗口複製命令,然後將命令粘貼到vs2008命令提示符。

我知道如果我在不同的時間編譯相同的源代碼,由於彙編元數據中的時間戳,我獲得了不同的二進制文件。事實上,如果我比較在不同時間由vs2008生成的兩個二進制文件,我會注意到二進制數據之間的小差異。

但是,如果我用vs編譯,然後用csc編譯,二進制文件就非常不同了! 你知道爲什麼嗎?怎麼了?

+0

他們有什麼不同? – 2009-06-13 17:31:15

+0

如果使用ildasm.exe(從Visual Studio命令提示符)反彙編程序集,該怎麼辦?您可以保存轉儲並對其進行分析。 – 2009-06-13 17:31:24

回答

1

不能保證編譯器所做的元數據的任何特定順序。也就是說,在進程內編譯器和csc.exe之間沒有任何意圖導致不同的順序。

0

一個非常大膽的猜測,但也許VS IDE和您的終端中的環境變量不一樣。在更糟糕的情況下,您的終端版本可能會鏈接到另一個.NET框架,或者至少與其他庫/代碼文件或編譯器開關相關聯?

0

您還沒有說過您是在Visual Studio中構建調試版還是二進制版本。我不確定命令行的默認值是否與相同,其中有

嘗試用明確的/debug/o交換機建設(設置爲,但是你想他們),並在Visual Studio中對其進行匹配。另外定義DEBUG和/或TRACE符號,如果您在Visual Studio生成配置中定義它們。

0

@ Marc Gravell,Divo,Jon:我嘗試用ILDASM反彙編這兩個組件。經過深入的分析和比較,我發現IL的內容是完全一樣的,但是所有的類和方法,屬性獲取器和setter等在程序集中的順序完全不同!所以如果我比較兩個程序集和十六進制編輯器/比較器,我會看到一個完全不同的二進制體!

現在我需要理解爲什麼VS和Csc以這種不同的方式與編譯器交互!

您是否參考瞭解釋兩種認可的文檔?