如何检查装配是否已更改

时间:2009-06-30 10:26:08

标签: c# .net

是否可以判断装配是否已更改?

我有一个标准项目,它生成一个名为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));
    }
}

由于

罗汉

6 个答案:

答案 0 :(得分:4)

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

这是调试器将程序集与其.pdb文件的正确版本匹配的原因(这也是为什么你必须始终将.pdb保存在你发布的任何内容上的原因,并且你不能依赖于能够生成一个pdb来匹配现有的装配)

答案 1 :(得分:2)

您可以在生成后将哈希存储在文本文件中,然后在下次重新编译时对其进行检查。

答案 2 :(得分:1)

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

然后你可以检查版本号。

答案 3 :(得分:0)

This project似乎通过在生成MVID哈希之前反汇编每个文件并删除MD5 GUID以及其他一些位来实现这一目的。它依赖于ildasm.exe

答案 4 :(得分:0)

目前,这确实不是一件小事-但是-我已经筹集了两张门票 .net平台本身,也适用于ilSpy-据我所知,它们是将来可以实现特定功能的最佳人选。

如果您想了解目前如何实施的替代方法,请参阅票证说明。

现在在此处提供两个链接:

答案 5 :(得分:0)

每个程序集都有一个 ModuleVersionId GUID,其作用类似于散列。如果您更改单个字符,模块 id 会更改,但如果您还原它,则会返回旧的 id。这对于比较程序集的两个版本很有用。

var assembly = Assembly.GetEntryAssembly();
var hashId = assembly.ManifestModule.ModuleVersionId;
Console.WriteLine(hashId);
40744db8-a8fe-4591-9b2c-d9e3e04a2f0a

https://docs.microsoft.com/en-us/dotnet/api/system.reflection.module.moduleversionid?view=net-5.0