2009-06-30 77 views
3

是否可以判断装配是否已更改?如何检查装配是否已更改

我有一个标准项目,生成名为MyAssembly.dll的程序集。

在一个单独的项目中,我读取程序集并生成一个散列。

当我为程序集生成散列时,每次重新编译时它都是不同的。我已经将程序集版本设置为静态,是否还有其他属性需要更改?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var array = File.ReadAllBytes(@"MyAssembly.dll"); 
     SHA256Managed algo = new SHA256Managed(); 
     var hash = algo.ComputeHash(array); 

     Console.WriteLine(Convert.ToBase64String(hash)); 
    } 
} 

感谢

罗汉

+0

你会在该程序集中安装多少个类? – 2009-06-30 10:29:42

+0

任何数量的类,目前只有一个类 – 2009-06-30 10:35:55

回答

4

您可能需要使用版本号属性。哈希将不起作用,因为任何时候你重新编译一个程序集,它会有所不同 - 即使代码根本没有改变。原因在于,每次编译时,编译器都会将guid嵌入到程序集中,并将相同的guid放入相应的.pdb文件中。每次编译程序集时,guid都会改变。

这是调试器如何将程序集匹配到其.pdb文件的正确版本(这也是为什么您必须始终将.pdb保存在您发布的任何东西上,而且您不能依赖于能够生成pdb以匹配现有的程序集)

2

您可以在哈希存储在一个文本文件中生成后,再核对它重新编译的下一次。

+0

这就是我在做什么,即使没有对代码进行更改,重新编译会生成新的哈希。 – 2009-06-30 10:39:04

1

那么,如果它是一个你自己管理的程序集,我会建议每次构建该程序集时添加一个版本号和auto-increase版本号。

然后你可以检查versionnumber。

0

This project似乎可以通过在生成MD5哈希之前拆分每个文件并删除MVID GUID以及其他几个位来解决问题。它依赖于ildasm.exe