2011-06-02 31 views
13

設置:反彙編兩個由相同源代碼構建的.NET可執行文件有什麼區別?

  • 相同的源代碼被用於在兩個不同的機器建立一個.NET 4可執行(控制檯應用程序)。
  • Microsoft Visual Studio 2010 SP1 .NET 4設置在兩臺機器上是相同的
  • ildasm projectName.exe /out:test.txt在兩臺機器上的.exe上執行。
  • ildasm輸出不同於預期差異(mvid,privateimplementationdetails)。

問題:
我花了一些時間來創建一個應用程序來獲得一個.NET可執行文件的CRC,並已成功地忽略所有不同的構建時的數據。

我正在刪除ildasm.exe輸出中// =============== CLASS MEMBERS DECLARATION ===================行以上的所有數據。這忽略了MVID。我構建.exe沒有調試信息。最後,我解析輸出<PrivateImplementationDetails>{GUID}並忽略這些。

我然後CRC剩餘的文本文件。

當同一個項目建立在同一臺計算機上時,這些CRC是相同的,但是當同一個項目在具有相同源代碼和MSVS 2010設置的另一臺計算機上構建時,CRC是不同的。

有誰知道存儲在.NET可執行文件的程序集中的任何與機器相關的信息嗎?

下面是一個差異的例子。看來,不同的ID被分配的每個對象和類,但是我覺得很奇怪,當他們的代碼是建立在不同的機器上,這將只是不同...

  `class DSC_PI.MainWindow/'<>c__DisplayClass21' V_2,` 
     `class DSC_PI.MainWindow/'<>c__DisplayClass10' V_2,` 

     `class DSC_PI.MainWindow/'<>c__DisplayClass1e' V_3,` 
     `class DSC_PI.MainWindow/'<>c__DisplayClassd' V_3,` 

任何有識之士將不勝感激。

+2

您確定兩個系統都安裝了相同的Service Pack,包括GAC中所有.NET程序集的相同版本嗎?你是否只從一個包含源代碼的乾淨目錄進行完全重建?當舊版本的程序集留在bin和obj目錄中時,我遇到了類似的奇怪問題。 – 2011-06-02 18:16:08

+0

恩,謝謝。我會研究這些,但我覺得這種意外的麻煩可能會被忽略,因爲我們將使用一個「主構建機器」來構建和壓縮一切。危機在那裏避開了,但我仍然有興趣找出它們。不幸的是,我可能只是不得不拋開這個問題,繼續前進(長期以來一直在研究這個小東西......)。如果我發現任何新東西,我會保持這個更新。 – ZayJay 2011-06-02 18:27:23

+6

我會建議,當你到達「主構建機器」時,你使用MSBUILD從命令行進行構建,而不是使用Visual Studio。我用MSBUILD獲得了更好的運行結果。另外,它更容易自動化。 – 2011-06-02 18:38:48

回答

1

這兩個系統的內核數量是否相同?我可以想象,當計算變量名後綴時,結果可能會因編譯器使用的線程數而有所不同。

相關問題