2016-12-02 83 views
5

我所有的代碼都在源代碼控制之下,所以我100%確定源代碼沒有改變。但是如果我構建一個C#DLL兩次他們的內容稍有不同。我可以通過建造,然後再次建造100%的時間來重現問題。從同一源代碼生成的兩個DLL文件有什麼區別

這似乎沒有影響程序,但是用於從兩個MSI文件創建修補程序的工具(如MSIMSP)被這些細微的更改拋出。製作補丁(對於我的產品)比應該大40倍。

我已經反編譯了這兩個DLL及其程序集信息,類等等,都完全一樣。這些文件的大小也完全相同,但創建時間不同。所以我真的無法摸清已經發生了什麼變化。

所以我挖得更深一點。

我已經使用WinDiff查找更改,然後在十六進制編輯器中交叉引用這些更改。 WinDiff在第二個「行」中顯示了一個變化,並在文件的大約80%處排成一行。

在十六進制編輯器中,我看到更改的第一個字節是字節0x088(字節136)。這似乎是這條'線'上唯一改變的字節。我很難找到第二個改變,因爲WinDiff沒有告訴我改變的確切字節偏移量。

這是更改的圖像,正確的文件是新文件的內容。 Hex view

是否有人熟悉(C#)DLL文件的構成知道更改的字節可能意味着什麼?或者更好,但如何確保DLL文件在重建時保持完全相同?

+0

有時在我的bin/release文件夾中有一個名爲$ RANDOM_SEED $的文件,並且每次重建時都會更改該文件的內容。我沒有詳細說明,但我可以想象這是兩個變化之一。有人需要做一些研究。 **編輯:**(它的nunit,可能對dll沒有影響,所以忘記我的評論)http://stackoverflow.com/a/40382757/5962841 – Mafii

+0

這可能是值得你嘗試一個好的文本/十六進制編輯器如Vedit。自1989年以來,我一直在使用它。即使在這些IDE和intellisense時代,它也是一個很好的工具。 www.vedit.com –

+3

[如何判斷兩個Net DLL是否相同](http://stackoverflow.com/questions/2735643/how-can-i-tell-whether-two-net-dlls-are-同樣)似乎從另一個角度來看同一個問題。 –

回答

4

這可能是與建立和之間的差異重建

Difference between Build Solution, Rebuild Solution, and Clean Solution in Visual Studio?

,如果它不認爲它需要重建一個項目,它不會。它可能 也可以使用項目部分建成位,如果他們沒有改變

執行編譯使用場景,因此後面的元數據您的DLL的可以是不同的

Why is a different dll produced after a clean build, with no code changes?

解決方案:

您將需要爲執行確定性構建描述here

+0

但是多次構建應該每次都會產生完全相同的二進制文件,不是嗎? – Mafii

+1

@Mafii不幸的是總有一些事情發生在幕後......元數據看起來像http://stackoverflow.com/questions/107196/why-is-a-different-dll-produced-after-a-clean-沒有代碼修改,所以沒有他們不會產生相同的二進制文件 – Fuzzybear

+0

@Fuzzybear任何方式來忽略創建補丁的元數據字節? (也許我應該問,作爲一個單獨的問題) –