2016-09-28 26 views
0

問題是,重建完全相同的代碼與前一版本的結果相比會生成不同的程序集。如何計算程序集的哈希值,以便可以使用此哈希值來判斷程序集中的代碼是否已更改?

爲什麼我需要這個?我有一個T4模板,可以從給定的合約程序集生成特定的源代碼。該源代碼即使生成,也會簽入VCS。這是因爲合同大會變動相對較少。但是,當它發生變化時,只要上述T4模板沒有被重新評估,我想失敗。

我的計劃是到廠承包裝配的散列碼生成的源文件中,例如:

// 1B-D0-06-48-02-C2-C5-C5-48-37-AA-61-66-6B-6D-01 

有將是,當包含模板項目建成運行的MSBuild任務。該任務將計算合約彙編哈希值並將其與生成的源代碼中的值進行比較。不平等意味着合同大會已經改變,我們需要重新運行模板。

存儲程序集版本並沒有幫助 - 它在開發過程中是一樣的。

另一種解決方案是在運行時將模板評估爲臨時文件,如果不同,則將其複製到生成的源文件中 - 不需要使用散列。

但是,我想吸引開發商的注意力,合同改變的事實。在這一點上,我希望開發人員手動重新評估模板。但只有在需要的時候。

我想我可以寫一個複雜的代碼,反映在合同大會創建某種類型的規範表示形式。以此規範表示的散列應該是它。但是,這不是微不足道的,我想看看是否可以避免。

+1

做,這是給你的集強名稱,其中包括加密簽名的正確方法。此功能內置於.NET中。例如,請參閱https://stackoverflow.com/questions/1436879/what-is-strong-naming-and-how-do-i-strong-name-a-binary。如果你想要一種不同的方法,你的問題太廣泛了,因爲有很多不同的方法可以解決它。 –

+0

您可以檢查重新編譯引起的差異。大多數情況下,彙編元數據中只有編譯時間。 – max630

+0

@PeterDuniho - 簽名不是問題。你下一步怎麼做? – mark

回答

2

我想我可以寫一個複雜的代碼,關於承包裝配反映創建某種類型的公司的規範表示

其實,ildasm可以做到這一點的。如果調用以下參數:

ildasm /text /pubonly _dll_ 

它將打印到stdout大會的公共接口

+1

比比較DLL更好。雖然,必須從輸出中刪除'// Image base:'和'// MVID:'行。所以,它可以使用。我想知道結果是否會得到改善,因爲'ildasm'對我來說產生了太多的輸出。當然,我只需要簽名以及自定義屬性。例如,不需要方法體。 – mark